sa-token 之權限驗證
- 2021 年 1 月 18 日
- 筆記
權限驗證
核心思想
所謂權限驗證,驗證的核心就是當前賬號是否擁有一個權限碼
有:就讓你通過、沒有:那麼禁止訪問
再往底了說,就是每個賬號都會擁有一個權限碼集合,我來驗證這個集合中是否包括我需要檢測的那個權限碼
例如:當前賬號擁有權限碼集合:[“user:add”, “user:delete”, “user:get”],這時候我去驗證權限碼:”user:update”,則結果就是驗證失敗,禁止訪問
所以現在問題的核心就是:
- 如何獲取一個賬號所擁有的的權限碼集合
- 本次操作要驗證的權限碼是哪個
獲取當前賬號權限碼集合
因為每個項目的需求不同,其權限設計也千變萬化,【獲取當前賬號權限碼集合】這一操作不可能內置到框架中, 所以sa-token將此操作以接口的方式暴露給你,以方便的你根據自己的業務邏輯進行重寫
- 你需要做的就是新建一個類,重寫StpInterface接口,例如以下代碼:
package com.pj.satoken;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Component;
import cn.dev33.satoken.stp.StpInterface;
/**
* 自定義權限驗證接口擴展
*/
@Component // 保證此類被springboot掃描,完成sa-token的自定義權限驗證擴展
public class StpInterfaceImpl implements StpInterface {
/**
* 返回一個賬號所擁有的權限碼集合
*/
@Override
public List<String> getPermissionCodeList(Object loginId, String loginKey) {
// 本list僅做模擬,實際項目中要根據具體業務邏輯來查詢權限
List<String> list = new ArrayList<String>();
list.add("101");
list.add("user-add");
list.add("user-delete");
list.add("user-update");
list.add("user-get");
list.add("article-get");
return list;
}
/**
* 返回一個賬號所擁有的角色標識集合 (權限與角色可分開校驗)
*/
@Override
public List<String> getRoleList(Object loginId, String loginKey) {
// 本list僅做模擬,實際項目中要根據具體業務邏輯來查詢角色
List<String> list = new ArrayList<String>();
list.add("admin");
list.add("super-admin");
return list;
}
}
- 可參考代碼:碼云:StpInterfaceImpl.java
驗證是否包含指定權限碼
然後就可以用以下api來鑒權了
StpUtil.hasPermission(Object pcode)
- 查詢當前賬號是否含有指定權限,返回true或false
StpUtil.checkPermission(Object pcode)
- 檢測當前賬號是否含有指定權限,如果有則安全通過,如果沒有則拋出異常:NotPermissionException
- 擴展:NotPermissionException 對象可通過 getLoginKey() 方法獲取具體是哪個 StpLogic 拋出的異常
StpUtil.checkPermissionAnd(Object... pcode)
檢測當前賬號是否含有指定權限【指定多個,必須全都有,否則拋出異常】
StpUtil.checkPermissionOr(Object... pcode)
-檢測當前賬號是否含有指定權限【指定多個,有一個就可以了,全都沒有才會拋出異常】
攔截全局異常
有同學要問,鑒權失敗,拋出異常,然後呢?要把異常顯示給用戶看嗎?
當然不能把異常拋給用戶看,你可以創建一個全局異常攔截器,統一返回給前端的格式,例如以下示例:
- 可參考:碼云:GlobalException.java
寫在最後
源碼開源,作者不易,如果你喜歡這個框架麻煩你隨手點一顆小星星哦!
- 官網文檔://sa-token.dev33.cn/
- Gitee開源地址: //gitee.com/sz6/sa-token
- GitHub開源地址: //github.com/click33/sa-token