shiro太複雜?快來試試這個輕量級許可權認證框架!
阿新 • • 發佈:2021-03-16
## 前言
在java的世界裡,有很多優秀的許可權認證框架,如`Apache Shiro`、`Spring Security` 等等。這些框架背景強大,歷史悠久,其生態也比較齊全。
但同時這些框架也並非十分完美,在前後臺分離已成標配的網際網路時代,這些老牌框架的很多設計理念已經相當滯後,無法與我們的專案完美契合。
而今天我要介紹的這款框架,專門為前後臺分離架構而生, 功能強大, 上手簡單 —— sa-token。
## Sa-Token是什麼?
sa-token是一個輕量級Java許可權認證框架,主要解決:登入認證、許可權認證、Session會話、單點登入、OAuth2.0 等一系列許可權相關問題
框架針對踢人下線、自動續簽、前後臺分離、分散式會話……等常見業務進行N多適配,通過sa-token,你可以以一種極簡的方式實現系統的許可權認證部分
與其它許可權認證框架相比,`sa-token` 具有以下優勢:
1. **簡單** :可零配置啟動框架,真正的開箱即用,低成本上手
2. **強大** :目前已整合幾十項許可權相關特性,涵蓋了大部分業務場景的解決方案
3. **易用** :如絲般順滑的API呼叫,大量高階特性統統只需一行程式碼即可實現
4. **高擴充套件** :幾乎所有元件都提供了擴充套件介面,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呼叫非常簡單,有多簡單呢?以登入驗證為例,你只需要:
``` java
// 在登入時寫入當前會話的賬號id
StpUtil.setLoginId(10001);
// 然後在任意需要校驗登入處呼叫以下API
// 如果當前會話未登入,這句程式碼會丟擲 `NotLoginException`異常
StpUtil.checkLogin();
```
至此,我們已經藉助sa-token框架完成登入授權!
此時的你小腦袋可能飄滿了問號,就這麼簡單?自定義Realm呢?全域性過濾器呢?我不用寫各種配置檔案嗎?
事實上在此我可以負責的告訴你,在sa-token中,登入授權就是如此的簡單,不需要什麼全域性過濾器,不需要各種亂七八糟的配置!只需要這一行簡單的API呼叫,即可完成會話的登入授權!
當你受夠Shiro、Security等框架的三拜九叩之後,你就會明白,相對於這些傳統老牌框架,sa-token的API設計是多麼的清爽!
許可權認證示例 (只有具有`user:add`許可權的會話才可以進入請求)
``` java
@SaCheckPermission("user:add")
@RequestMapping("/user/insert")
public String insert(SysUser user) {
// ...
return "使用者增加";
}
```
將某個賬號踢下線 (待到對方再次訪問系統時會丟擲`NotLoginException`異常)
``` java
// 使賬號id為10001的會話登出登入
StpUtil.logoutByLoginId(10001);
```
除了以上的示例,sa-token還可以一行程式碼完成以下功能:
``` java
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眾多,請恕此處無法為您逐一展示,更多示例請戳官方線上文件
**最後附上專案連結:**
- 官網文件:[http://sa-token.dev33.cn/](http://sa-token.dev33.cn/)
- Gitee開源地址: [https://gitee.com/sz6/sa-token](https://gitee.com/sz6/sa-token)
- GitHub開源地址: [https://github.com/click33/sa-token](https://github.com/click33/s