今天給大家推薦的這個開源項目超級棒,可能是史上功能最全的 Java 權限認證框架!
這個開源項目就是:sa-token 。
Sa-Token是什麼?
sa-token是一個輕量級Java權限認證框架,主要解決:登錄認證、權限認證、Session會話、單點登錄、OAuth2.0 等一系列權限相關問題
框架針對踢人下線、自動續簽、前後臺分離、分佈式會話……等常見業務進行N多適配,通過sa-token,你可以以一種極簡的方式實現系統的權限認證部分
與其它權限認證框架相比,sa-token
具有以下優勢:
- 簡單 :可零配置啓動框架,真正的開箱即用,低成本上手
- 強大 :目前已集成幾十項權限相關特性,涵蓋了大部分業務場景的解決方案
- 易用 :如絲般順滑的API調用,大量高級特性統統只需一行代碼即可實現
- 高擴展 :幾乎所有組件都提供了擴展接口,90%以上的邏輯都可以按需重寫
有了sa-token,你所有的權限認證問題,都不再是問題!
Sa-Token 能做什麼?
- 登錄驗證 —— 輕鬆登錄鑑權,並提供五種細分場景值
- 權限驗證 —— 適配RBAC權限模型,不同角色不同授權
- Session會話 —— 專業的數據緩存中心
- 踢人下線 —— 將違規用戶立刻清退下線
- 持久層擴展 —— 可集成Redis、Memcached等專業緩存中間件,重啓數據不丟失
- 分佈式會話 —— 提供jwt集成和共享數據中心兩種分佈式會話方案
- 單點登錄 —— 一處登錄,處處通行
- 模擬他人賬號 —— 實時操作任意用戶狀態數據
- 臨時身份切換 —— 將會話身份臨時切換爲其它賬號
- 無Cookie模式 —— APP、小程序等前後臺分離場景
- 同端互斥登錄 —— 像QQ一樣手機電腦同時在線,但是兩個手機上互斥登錄
- 多賬號認證體系 —— 比如一個商城項目的user表和admin表分開鑑權
- 花式token生成 —— 內置六種token風格,還可自定義token生成策略
- 註解式鑑權 —— 優雅的將鑑權與業務代碼分離
- 路由攔截式鑑權 —— 根據路由攔截鑑權,可適配restful模式
- 自動續簽 —— 提供兩種token過期策略,靈活搭配使用,還可自動續簽
- 會話治理 —— 提供方便靈活的會話查詢接口
- 組件自動注入 —— 零配置與Spring等框架集成
- 更多功能正在集成中... —— 如有您有好想法或者建議,歡迎加羣交流
代碼示例
sa-token的API調用非常簡單,有多簡單呢?以登錄驗證爲例,你只需要:
// 在登錄時寫入當前會話的賬號id
StpUtil.setLoginId(10001);
// 然後在任意需要校驗登錄處調用以下API
// 如果當前會話未登錄,這句代碼會拋出 `NotLoginException`異常
StpUtil.checkLogin();
至此,我們已經藉助sa-token框架完成登錄授權!
此時的你小腦袋可能飄滿了問號,就這麼簡單?自定義Realm呢?全局過濾器呢?我不用寫各種配置文件嗎?
事實上在此我可以負責的告訴你,在sa-token中,登錄授權就是如此的簡單,不需要什麼全局過濾器,不需要各種亂七八糟的配置!只需要這一行簡單的API調用,即可完成會話的登錄授權!
當你受夠Shiro、Security等框架的三拜九叩之後,你就會明白,相對於這些傳統老牌框架,sa-token的API設計是多麼的清爽!
權限認證示例 (只有具有user:add
權限的會話纔可以進入請求)
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
return "用戶增加";
}
將某個賬號踢下線 (待到對方再次訪問系統時會拋出NotLoginException
異常)
// 使賬號id爲10001的會話註銷登錄
StpUtil.logoutByLoginId(10001);
除了以上的示例,sa-token還可以一行代碼完成以下功能:
StpUtil.setLoginId(10001); // 標記當前會話登錄的賬號id
StpUtil.getLoginId(); // 獲取當前會話登錄的賬號id
StpUtil.isLogin(); // 獲取當前會話是否已經登錄, 返回true或false
StpUtil.logout(); // 當前會話註銷登錄
StpUtil.logoutByLoginId(10001); // 讓賬號爲10001的會話註銷登錄(踢人下線)
StpUtil.hasRole("super-admin"); // 查詢當前賬號是否含有指定角色標識, 返回true或false
StpUtil.hasPermission("user:add"); // 查詢當前賬號是否含有指定權限, 返回true或false
StpUtil.getSession(); // 獲取當前賬號id的Session
StpUtil.getSessionByLoginId(10001); // 獲取賬號id爲10001的Session
StpUtil.getTokenValueByLoginId(10001); // 獲取賬號id爲10001的token令牌值
StpUtil.setLoginId(10001, "PC"); // 指定設備標識登錄
StpUtil.logoutByLoginId(10001, "PC"); // 指定設備標識進行強制註銷 (不同端不受影響)
StpUtil.switchTo(10044); // 將當前會話身份臨時切換爲其它賬號
開源項目地址:
PS:如果覺得我的分享不錯,歡迎大家隨手點贊、在看。
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2021最新版)
2.別在再滿屏的 if/ else 了,試試策略模式,真香!!
3.臥槽!Java 中的 xx ≠ null 是什麼新語法?
4.Spring Boot 2.5 重磅發佈,黑暗模式太炸了!
覺得不錯,別忘了隨手點贊+轉發哦!