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

前言

在java的世界裡,有很多優秀的許可權認證框架,如Apache ShiroSpring 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調用非常簡單,有多簡單呢?以登錄驗證為例,你只需要:

// 在登錄時寫入當前會話的帳號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眾多,請恕此處無法為您逐一展示,更多示例請戳官方在線文檔

最後附上項目鏈接: