在線資料
Sa-Token 介紹
Sa-Token是一個輕量級Java權限認證框架,主要解決:登錄認證、權限認證、Session會話、單點登錄、OAuth2.0、微服務網關鑒權 等一系列權限相關問題
框架集成簡單、開箱即用、API設計清爽,通過Sa-Token,你將以一種極其簡單的方式實現系統的權限認證部分
- 登錄認證 —— 單端登錄、多端登錄、同端互斥登錄、七天內免登錄
- 權限認證 —— 權限認證、角色認證、會話二級認證
- Session會話 —— 全端共享Session、單端獨享Session、自定義Session
- 踢人下線 —— 根據賬號id踢人下線、根據Token值踢人下線
- 賬號封禁 —— 指定天數封禁、永久封禁、設定解封時間
- 持久層擴展 —— 可集成Redis、Memcached等專業緩存中間件,重啟數據不丟失
- 分布式會話 —— 提供jwt集成、共享數據中心兩種分布式會話方案
- 微服務網關鑒權 —— 適配Gateway、ShenYu、Zuul等常見網關的路由攔截認證
- 單點登錄 —— 內置三種單點登錄模式:無論是否跨域、是否共享Redis,都可以搞定
- OAuth2.0認證 —— 基於RFC-6749標准編寫,OAuth2.0標准流程的授權認證,支持openid模式
- 二級認證 —— 在已登錄的基礎上再次認證,保證安全性
- 獨立Redis —— 將權限緩存與業務緩存分離
- 臨時Token驗證 —— 解決短時間的Token授權問題
- 模擬他人賬號 —— 實時操作任意用戶狀態數據
- 臨時身份切換 —— 將會話身份臨時切換為其它賬號
- 前后台分離 —— APP、小程序等不支持Cookie的終端
- 同端互斥登錄 —— 像QQ一樣手機電腦同時在線,但是兩個手機上互斥登錄
- 多賬號認證體系 —— 比如一個商城項目的user表和admin表分開鑒權
- 花式token生成 —— 內置六種Token風格,還可:自定義Token生成策略、自定義Token前綴
- 注解式鑒權 —— 優雅的將鑒權與業務代碼分離
- 路由攔截式鑒權 —— 根據路由攔截鑒權,可適配restful模式
- 自動續簽 —— 提供兩種Token過期策略,靈活搭配使用,還可自動續簽
- 會話治理 —— 提供方便靈活的會話查詢接口
- 記住我模式 —— 適配[記住我]模式,重啟瀏覽器免驗證
- 密碼加密 —— 提供密碼加密模塊,可快速MD5、SHA1、SHA256、AES、RSA加密
- 全局偵聽器 —— 在用戶登陸、注銷、被踢下線等關鍵性操作時進行一些AOP操作
- 開箱即用 —— 提供SpringMVC、WebFlux等常見web框架starter集成包,真正的開箱即用
- 更多功能正在集成中... —— 如有您有好想法或者建議,歡迎加群交流
Sa-Token 源碼模塊一覽
── sa-token ├── sa-token-core // [核心] Sa-Token 核心模塊 ├── sa-token-starter // [整合] Sa-Token 與其它框架整合 ├── sa-token-servlet // [整合] Sa-Token 整合 Servlet容器實現類包 ├── sa-token-spring-boot-starter // [整合] Sa-Token 整合 SpringBoot 快速集成 ├── sa-token-reactor-spring-boot-starter // [整合] Sa-Token 整合 Reactor響應式編程 快速集成 ├── sa-token-solon-plugin // [整合] Sa-Token 整合 Solon 快速集成 ├── sa-token-plugin // [插件] Sa-Token 插件合集 ├── sa-token-dao-redis // [插件] Sa-Token 整合 Redis (使用jdk默認序列化方式) ├── sa-token-dao-redis-jackson // [插件] Sa-Token 整合 Redis (使用jackson序列化方式) ├── sa-token-spring-aop // [插件] Sa-Token 整合 SpringAOP 注解鑒權 ├── sa-token-temp-jwt // [插件] Sa-Token 整合 jwt 臨時令牌鑒權 ├── sa-token-quick-login // [插件] Sa-Token 快速注入登錄頁插件 ├── sa-token-alone-redis // [插件] Sa-Token 獨立Redis插件,實現[權限緩存與業務緩存分離] ├── sa-token-oauth2 // [插件] Sa-Token 實現 OAuth2.0 模塊 ├── sa-token-demo // [示例] Sa-Token 示例合集 ├── sa-token-demo-springboot // [示例] Sa-Token 整合 SpringBoot ├── sa-token-demo-webflux // [示例] Sa-Token 整合 WebFlux ├── sa-token-demo-jwt // [示例] Sa-Token 集成 jwt ├── sa-token-demo-solon // [示例] Sa-Token 集成 Solon ├── sa-token-demo-quick-login // [示例] Sa-Token 集成 quick-login 模塊 ├── sa-token-demo-alone-redis // [示例] Sa-Token 集成 alone-redis 模塊 ├── sa-token-demo-sso1 // [示例] Sa-Token 集成 SSO單點登錄-模式一 ├── sa-token-demo-sso2-server // [示例] Sa-Token 集成 SSO單點登錄-模式二 認證中心 ├── sa-token-demo-sso2-client // [示例] Sa-Token 集成 SSO單點登錄-模式二 應用端 ├── sa-token-demo-sso3-server // [示例] Sa-Token 集成 SSO單點登錄-模式三 認證中心 ├── sa-token-demo-sso3-client // [示例] Sa-Token 集成 SSO單點登錄-模式三 應用端 ├── sa-token-demo-oauth2-server // [示例] Sa-Token 集成 OAuth2.0 (服務端) ├── sa-token-demo-oauth2-client // [示例] Sa-Token 集成 OAuth2.0 (客戶端) ├── sa-token-doc // [文檔] Sa-Token 開發文檔 ├──pom.xml // [依賴] 頂級pom文件
Sa-Token 功能結構圖
Sa-Token 認證流程圖
Sa-Token-SSO 單點登錄
對於單點登錄,網上教程大多以CAS模式為主,其實對於不同的系統架構,實現單點登錄的步驟也大為不同,Sa-Token由簡入難將其划分為三種模式:
系統架構 | 采用模式 | 簡介 | 文檔鏈接 |
---|---|---|---|
前端同域 + 后端同 Redis | 模式一 | 共享Cookie同步會話 | 文檔、示例 |
前端不同域 + 后端同 Redis | 模式二 | URL重定向傳播會話 | 文檔、示例 |
前端不同域 + 后端 不同Redis | 模式三 | Http請求獲取會話 | 文檔、示例 |
- 前端同域:就是指多個系統可以部署在同一個主域名之下,比如:
c1.domain.com
、c2.domain.com
、c3.domain.com
- 后端同Redis:就是指多個系統可以連接同一個Redis,其它的緩存數據中心亦可。PS:這里並不需要把所有項目的數據都放在同一個Redis中,Sa-Token提供了
[權限緩存與業務緩存分離]
的解決方案,詳情戳:Alone獨立Redis插件 - 如果既無法做到前端同域,也無法做到后端同Redis,那么只能走模式三,Http請求獲取會話(Sa-Token對SSO提供了完整的封裝,你只需要按照示例從文檔上復制幾段代碼便可以輕松集成)
- 技術選型一定要根據系統架構對症下葯,切不可胡亂選擇
Sa-Token-SSO 特性
- API簡單易用,文檔介紹詳細,且提供直接可用的集成示例
- 支持三種模式,不論是否跨域、是否共享Redis,都可以完美解決
- 安全性高:內置域名校驗、Ticket校驗、秘鑰校驗等,杜絕
Ticket劫持
、Token竊取
等常見攻擊手段(文檔講述攻擊原理和防御手段) - 不丟參數:筆者曾試驗多個單點登錄框架,均有參數丟失的情況,比如重定向之前是:
http://a.com?id=1&name=2
,登錄成功之后就變成了:http://a.com?id=1
,Sa-Token-SSO內有專門的算法保證了參數不丟失,登錄成功之后原路返回頁面 - 無縫集成:由於Sa-Token本身就是一個權限認證框架,因此你可以只用一個框架同時解決
權限認證
+單點登錄
問題,讓你不再到處搜索:xxx單點登錄與xxx權限認證如何整合…… - 高可定制:Sa-Token-SSO模塊對代碼架構侵入性極低,結合Sa-Token本身的路由攔截特性,你可以非常輕松的定制化開發
Sa-Token-OAuth2.0 授權登錄
Sa-OAuth2 模塊基於 RFC-6749 標准 編寫,通過Sa-OAuth2你可以非常輕松的實現系統的OAuth2.0授權認證
- 授權碼(Authorization Code):OAuth2.0標准授權步驟,Server端向Client端下放Code碼,Client端再用Code碼換取授權Token
- 隱藏式(Implicit):無法使用授權碼模式時的備用選擇,Server端使用URL重定向方式直接將Token下放到Client端頁面
- 密碼式(Password):Client直接拿着用戶的賬號密碼換取授權Token
- 客戶端憑證(Client Credentials):Server端針對Client級別的Token,代表應用自身的資源授權
詳細參考文檔:http://sa-token.dev33.cn/doc/index.html#/oauth2/readme
代碼示例
Sa-Token的API調用非常簡單,有多簡單呢?以登錄驗證為例,你只需要:
// 在登錄時寫入當前會話的賬號id StpUtil.login(10001); // 然后在任意需要校驗登錄處調用以下API // 如果當前會話未登錄,這句代碼會拋出 `NotLoginException`異常 StpUtil.checkLogin();
至此,我們已經借助Sa-Token框架完成登錄授權!
此時的你小腦袋可能飄滿了問號,就這么簡單?自定義Realm呢?全局過濾器呢?我不用寫各種配置文件嗎?
事實上在此我可以負責的告訴你,在Sa-Token中,登錄授權就是如此的簡單,不需要什么全局過濾器,不需要各種亂七八糟的配置!只需要這一行簡單的API調用,即可完成會話的登錄授權!
當你受夠Shiro、Spring 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.login(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.login(10001, "PC"); // 指定設備標識登錄 StpUtil.logoutByLoginId(10001, "PC"); // 指定設備標識進行強制注銷 (不同端不受影響) StpUtil.switchTo(10044); // 將當前會話身份臨時切換為其它賬號
Sa-Token API 眾多,請恕此處無法為您逐一展示,更多示例請戳官方在線文檔
Star 趨勢
使用Sa-Token的開源項目
[ sa-plus ] 一個基於springboot架構的快速開發框架,內置代碼生成器
[ jthink ] 一個基於springboot+sa-token+thymeleaf的博客系統
[ dcy-fast ] 一個基於springboot+sa-token+mybatis-plus的后台管理系統,前端vue-element-admin,並且內置代碼生成器
如果您的項目使用了Sa-Token,歡迎提交pr
友情鏈接
[ okhttps ] 一個輕量級http通信框架,API設計無比優雅,支持 WebSocket 以及 Stomp 協議
[ 小諾快速開發平台 ] 基於SpringBoot2 + AntDesignVue全新快速開發平台,同時擁有三個版本
[ Jpom ] 簡而輕的低侵入式在線構建、自動部署、日常運維、項目監控軟件
交流群
QQ交流群:1002350610 點擊加入
微信交流群:
(掃碼添加微信,備注:sa-token,邀您加入群聊)