Sa-Token 一個輕量級 java 權限認證框架,讓鑒權變得簡單、優雅!


在線資料

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-js

Sa-Token 認證流程圖

sa-token-rz

Sa-Token-SSO 單點登錄

對於單點登錄,網上教程大多以CAS模式為主,其實對於不同的系統架構,實現單點登錄的步驟也大為不同,Sa-Token由簡入難將其划分為三種模式:

系統架構 采用模式 簡介 文檔鏈接
前端同域 + 后端同 Redis 模式一 共享Cookie同步會話 文檔示例
前端不同域 + 后端同 Redis 模式二 URL重定向傳播會話 文檔示例
前端不同域 + 后端 不同Redis 模式三 Http請求獲取會話 文檔示例
  1. 前端同域:就是指多個系統可以部署在同一個主域名之下,比如:c1.domain.comc2.domain.comc3.domain.com
  2. 后端同Redis:就是指多個系統可以連接同一個Redis,其它的緩存數據中心亦可。PS:這里並不需要把所有項目的數據都放在同一個Redis中,Sa-Token提供了 [權限緩存與業務緩存分離] 的解決方案,詳情戳:Alone獨立Redis插件
  3. 如果既無法做到前端同域,也無法做到后端同Redis,那么只能走模式三,Http請求獲取會話(Sa-Token對SSO提供了完整的封裝,你只需要按照示例從文檔上復制幾段代碼便可以輕松集成)
  4. 技術選型一定要根據系統架構對症下葯,切不可胡亂選擇

Sa-Token-SSO 特性

  1. API簡單易用,文檔介紹詳細,且提供直接可用的集成示例
  2. 支持三種模式,不論是否跨域、是否共享Redis,都可以完美解決
  3. 安全性高:內置域名校驗、Ticket校驗、秘鑰校驗等,杜絕Ticket劫持Token竊取等常見攻擊手段(文檔講述攻擊原理和防御手段)
  4. 不丟參數:筆者曾試驗多個單點登錄框架,均有參數丟失的情況,比如重定向之前是:http://a.com?id=1&name=2,登錄成功之后就變成了:http://a.com?id=1,Sa-Token-SSO內有專門的算法保證了參數不丟失,登錄成功之后原路返回頁面
  5. 無縫集成:由於Sa-Token本身就是一個權限認證框架,因此你可以只用一個框架同時解決權限認證 + 單點登錄問題,讓你不再到處搜索:xxx單點登錄與xxx權限認證如何整合……
  6. 高可定制:Sa-Token-SSO模塊對代碼架構侵入性極低,結合Sa-Token本身的路由攔截特性,你可以非常輕松的定制化開發

Sa-Token-OAuth2.0 授權登錄

Sa-OAuth2 模塊基於 RFC-6749 標准 編寫,通過Sa-OAuth2你可以非常輕松的實現系統的OAuth2.0授權認證

  1. 授權碼(Authorization Code):OAuth2.0標准授權步驟,Server端向Client端下放Code碼,Client端再用Code碼換取授權Token
  2. 隱藏式(Implicit):無法使用授權碼模式時的備用選擇,Server端使用URL重定向方式直接將Token下放到Client端頁面
  3. 密碼式(Password):Client直接拿着用戶的賬號密碼換取授權Token
  4. 客戶端憑證(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 趨勢

giteye-chart

github-chart

使用Sa-Token的開源項目

[ sa-plus ] 一個基於springboot架構的快速開發框架,內置代碼生成器

[ jthink ] 一個基於springboot+sa-token+thymeleaf的博客系統

[ dcy-fast ] 一個基於springboot+sa-token+mybatis-plus的后台管理系統,前端vue-element-admin,並且內置代碼生成器

[ helio-starters ] 基於JDK15 + Spring Boot 2.4 + Sa-Token + Mybatis-Plus的單體Boot版腳手架和微服務Cloud版腳手架,帶有配套后台管理前端模板及代碼生成器

[ sa-token-plugin ] Sa-Token第三方插件實現,基於Sa-Token-Core,提供一些與官方不同實現機制的的插件集合,作為Sa-Token開源生態的補充,針對spring-boot特性進行針對優化,更加方便於spring-boot一起使用

[ easy-admin ] 一個基於SpringBoot2 + Sa-Token + Mybatis-Plus + Snakerflow + Layui 的后台管理系統,靈活多變可前后端分離,也可單體,內置代碼生成器、權限管理、工作流引擎等

如果您的項目使用了Sa-Token,歡迎提交pr

友情鏈接

[ okhttps ] 一個輕量級http通信框架,API設計無比優雅,支持 WebSocket 以及 Stomp 協議

[ 小諾快速開發平台 ] 基於SpringBoot2 + AntDesignVue全新快速開發平台,同時擁有三個版本

[ Jpom ] 簡而輕的低侵入式在線構建、自動部署、日常運維、項目監控軟件

[ TLog ] 一個輕量級的分布式日志標記追蹤神器

交流群

QQ交流群:1002350610 點擊加入

微信交流群:

微信群

(掃碼添加微信,備注:sa-token,邀您加入群聊)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM