1. 程式人生 > 其它 >Sa-token給使用者分配許可權或分配角色

Sa-token給使用者分配許可權或分配角色

原文連結: https://blog.csdn.net/weixin_60414376/article/details/122989980

本文以一個小案例實現登入與許可權模組的開發,大致是資料庫有兩個使用者一個是超級管理員一個是普通使用者,只有超級管理員有查詢所有資訊的許可權,普通使用者點選查詢所有使用者顯示您未有相關許可權
1、登入頁面

2、管理員查詢:

3、學生查詢:

資料庫:

一)登入模組開發
1、去yml檔案中配置sa-token的基本配置:

# Sa-Token配置
sa-token:
# token名稱 (同時也是cookie名稱)
token-name: token
# token有效期,單位s 預設30天, -1代表永不過期
timeout: 2592000
# token臨時有效期 (指定時間內無操作就視為token過期) 單位: 秒
activity-timeout: -1
# 是否允許同一賬號併發登入 (為true時允許一起登入, 為false時新登入擠掉舊登入)
is-concurrent: true
# 在多人登入同一賬號時,是否共用一個token (為true時所有登入共用一個token, 為false時每次登入新建一個token)
is-share: false
# token風格
token-style: uuid
# 是否輸出操作日誌
is-log: false
2、在controller類中書寫登入方法:

最重要的就是將token返回以及id屬性的繫結

@RestController
@RequestMapping("/test")
@Tag(name = "許可權驗證")
public class test {

@Autowired
private signImpl signService;

@PostMapping("/signs")
@Operation(summary = "資料庫登入")
public R sign(@Valid @RequestBody signForm info) {
signService.canSign(info.getUserName(), info.getPassWord());
Integer id = signService.searchUserId(info.getUserName());
//將ID繫結在登入模組,後期授權有用
StpUtil.login(id);
String tokenValue = StpUtil.getTokenValue();
//在登入模組必須將Token返回給前端,否則前端呼叫某些方法會顯示未發現Token資訊異常
return new R().put("code", 200).put("msg", "登陸成功").put("token", tokenValue);
}
}

二)許可權模組開發
1、構建一個自定義許可權的類,實現StpInterface,重寫裡面的方法。

o預設是String型別,所以必須呼叫Integer的parse方法將其轉化為整型才能使用

package com.example.mineemos.Util;

import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import com.example.mineemos.db.dao.InforDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
@Component
public class authorGive implements StpInterface {
@Autowired
private InforDao inforDao;

//新增某些許可權可以訪問的
@Override
public List<String> getPermissionList(Object o, String s) {
return null;
}

//新增某些角色可以訪問的
@Override
public List<String> getRoleList(Object o, String lognType) {
//o屬性就是剛剛繫結的id,通過這個id去資料庫查詢許可權
Integer id= Integer.parseInt((String) o);
String role = inforDao.searchRole(id);
List<String> list = new ArrayList<String>();
//“*”許可權表示什麼都可以訪問
list.add(role);
return list;
}
}
2、因為要將許可權註解打在方法上,所以要先註冊攔截器:

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
// 註冊Sa-Token的註解攔截器,開啟註解式鑑權功能
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 註冊註解攔截器,並排除不需要註解鑑權的介面地址 (與登入攔截器無關)
registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
}
}
3、這時候就可以在查詢資訊的那個介面上打上對應的註解了。

// 角色認證:必須具有指定角色才能進入該方法
@SaCheckRole("管理員")
@Operation(summary = "只有管理員身份才能")
@PostMapping("/add")
public R add() {
List<Infor> infors = signService.searchAll();
return new R().put("msg", "成功").put("info",infors);
}
官方文件地址:

Sa-Token