1. 程式人生 > 其它 >sa-token 之許可權驗證

sa-token 之許可權驗證

技術標籤:許可權框架java

許可權驗證

核心思想

所謂許可權驗證,驗證的核心就是當前賬號是否擁有一個許可權碼
有:就讓你通過、沒有:那麼禁止訪問
再往底了說,就是每個賬號都會擁有一個許可權碼集合,我來驗證這個集合中是否包括我需要檢測的那個許可權碼
例如:當前賬號擁有許可權碼集合:[“user:add”, “user:delete”, “user:get”],這時候我去驗證許可權碼:“user:update”,則結果就是驗證失敗,禁止訪問
所以現在問題的核心就是:

  1. 如何獲取一個賬號所擁有的的許可權碼集合
  2. 本次操作要驗證的許可權碼是哪個

獲取當前賬號許可權碼集合

因為每個專案的需求不同,其許可權設計也千變萬化,【獲取當前賬號許可權碼集合】這一操作不可能內建到框架中, 所以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; } }

驗證是否包含指定許可權碼

然後就可以用以下api來鑑權了

StpUtil.hasPermission(Object pcode)
- 查詢當前賬號是否含有指定許可權,返回true或false

StpUtil.checkPermission(Object pcode)
- 檢測當前賬號是否含有指定許可權,如果有則安全通過,如果沒有則丟擲異常:NotPermissionException
- 擴充套件:NotPermissionException 物件可通過 getLoginKey() 方法獲取具體是哪個 StpLogic 丟擲的異常

StpUtil.checkPermissionAnd(Object... pcode)
檢測當前賬號是否含有指定許可權【指定多個,必須全都有,否則丟擲異常】

StpUtil.checkPermissionOr(Object... pcode)
-檢測當前賬號是否含有指定許可權【指定多個,有一個就可以了,全都沒有才會丟擲異常】

攔截全域性異常

有同學要問,鑑權失敗,丟擲異常,然後呢?要把異常顯示給使用者看嗎?
當然不能把異常拋給使用者看,你可以建立一個全域性異常攔截器,統一返回給前端的格式,例如以下示例:

寫在最後

原始碼開源,作者不易,如果你喜歡這個框架麻煩你隨手點一顆小星星哦!

在這裡插入圖片描述