shiro太複雜?快來試試這個輕量級許可權認證框架!
前言
在java的世界裡,有很多優秀的許可權認證框架,如Apache Shiro
、Spring Security
等等。這些框架背景強大,歷史悠久,其生態也比較齊全。
但同時這些框架也並非十分完美,在前後台分離已成標配的互聯網時代,這些老牌框架的很多設計理念已經相當滯後,無法與我們的項目完美契合。
而今天我要介紹的這款框架,專門為前後台分離架構而生, 功能強大, 上手簡單 —— 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過期策略,靈活搭配使用,還可自動續簽
- 會話治理 —— 提供方便靈活的會話查詢介面
- 記住我模式 —— 適配[記住我]模式,重啟瀏覽器免驗證
- 密碼加密 —— 提供密碼加密模組,可快速MD5、SHA1、SHA256、AES、RSA加密
- 組件自動注入 —— 零配置與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); // 將當前會話身份臨時切換為其它帳號
sa-token的API眾多,請恕此處無法為您逐一展示,更多示例請戳官方在線文檔
最後附上項目鏈接:
- 官網文檔://sa-token.dev33.cn/
- Gitee開源地址: //gitee.com/sz6/sa-token
- GitHub開源地址: //github.com/click33/sa-token