1. 程式人生 > >shiro太複雜?快來試試這個輕量級許可權認證框架!

shiro太複雜?快來試試這個輕量級許可權認證框架!

## 前言 在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