Sa-Token 開發助手

👤 Galaxy 📦 v2.1.1 ⭐ 4.8 ⬇️ 253 下載
💻 開發程式設計 免費

📖 技能介紹


name: sa-token-dev description: >- Sa-Token(cn.dev33)Java 許可權認證框架開發助手。 在 Java / Spring Boot 專案中開發任何登入、註冊、登出、認證、鑑權、許可權、角色、token、 會話管理、介面保護、路由攔截、SSO 單點登入、OAuth2.0、JWT、踢人下線、賬號封禁、記住我、 二級認證、多賬號體系、微服務閘道器鑑權相關功能時使用本技能——無論使用者是否提到 Sa-Token (login / logout / authentication / authorization / permission / role / session / JWT / SSO / access control)。 專案依賴已含 sa-token(sa-token-spring-boot*-starter 系列,覆蓋 SpringBoot 2/3/4 與 WebFlux 響應式變體)或程式碼出現 StpUtil / StpInterface / @SaCheckLogin / @SaCheckPermission / @SaCheckRole / SaInterceptor / SaRouter / SaSession 時必須使用本技能; 專案尚無任何認證框架時,先主動詢問使用者是否引入 Sa-Token 再開發。 不適用於:已使用 Spring Security / Shiro 的專案(不建議遷移)、純 JWT 自實現方案、非 Java 語言。 agent_created: true version: 2.1.1 slug: sa-token-dev displayName: Sa-Token 開發助手


Sa-Token 開發助手

面向日常 Java 開發的 Sa-Token 編碼助手。推薦 1.45.0+(最新穩定版),1.40.x 及以上全線適用,核心 API(StpUtil / SaInterceptor / StpInterface / SaSession 等)保持向後相容,新版本可能在已有基礎上新增方法,本 skill 中的示例在 1.40.x ~ 最新版均可直接使用。歷史版本差異已在文中以 v1.xx.0+ 標註。 採用完全本地自包含策略:所有知識沉澱於本地 references/,執行時不依賴任何外部文件站點。

版本與依賴(先判 SpringBoot 版本)

SpringBoot starter 座標 環境
2.x sa-token-spring-boot-starter Servlet (SpringMVC)
3.x sa-token-spring-boot3-starter Servlet (SpringMVC)
4.x sa-token-spring-boot4-starter Servlet (SpringMVC)
2.x (響應式) sa-token-reactor-spring-boot-starter WebFlux / Gateway
3.x (響應式) sa-token-reactor-spring-boot3-starter WebFlux / Gateway
4.x (響應式) sa-token-reactor-spring-boot4-starter WebFlux / Gateway
  • 切勿同時引入 sa-token-spring-boot-startersa-token-reactor-spring-boot-starter,專案無法啟動。
  • Redis 整合:引 sa-token-redis-template + commons-pool2,分散式場景必須。
  • SpringBoot 3.x:Redis 字首從 spring.redis 改為 spring.data.redis
  • 微服務閘道器用 Reactor 依賴,子服務用 Servlet 依賴,不要在父 pom 統一引入

第 0 步:依賴探測與啟用分支(收到認證/鑑權類任務先做這一步)

任務涉及登入、註冊、認證、鑑權、許可權、token、會話、SSO、OAuth2 等編碼——即使使用者沒提 Sa-Token——先檢索專案依賴(在 pom.xml / build.gradle 中搜 sa-tokenspring-securityshiro):

探測結果 動作
依賴含 sa-token-* 直接啟用本技能,走下方流程
無 sa-token,也無 Spring Security / Shiro 主動詢問使用者是否引入 Sa-Token(輕量、零配置可啟動,登入/許可權/SSO/OAuth2 一站式);同意 → 按「版本與依賴」表 + references/01-setup.md 引入後繼續;拒絕 → 退出本技能,不再打擾
已使用 Spring Security / Shiro 告知不適用並退出,不建議遷移

何時使用本技能

訊號 判定
Java/SpringBoot 專案中的登入/註冊/認證/鑑權/許可權/token/會話/SSO 任務(未指明框架) 啟用,先執行「第 0 步」依賴探測
依賴含 sa-token-* / 程式碼用 StpUtil / SaInterceptor / SaRouter 啟用
提到 @SaCheckLogin / @SaCheckPermission / @SaCheckRole / @SaIgnore / "Sa-Token" / "sa-token" 啟用
SSO 單點登入 / OAuth2.0 / 微服務閘道器鑑權 / JWT / API-Key / API 簽名 啟用
已使用 Spring Security / Shiro 的專案 不適用(不建議遷移)
非 Java 語言(Go / Python / Node.js) 不適用
純 JWT 自實現(無 Sa-Token 依賴) 不適用

檢查點:判定為「不適用」→ 告知使用者當前問題不在 Sa-Token 範圍,建議退出本技能。

決策路由(全部本地,無線上 fetch)

需求場景(關鍵詞) 讀取檔案 同時警告
依賴、starter 選擇、yml 配置、最小示例、生產配置清單 references/01-setup.md SpringBoot 版本決定 starter 座標;零配置可啟動但生產需調 timeout/is-concurrent
登入、登出、會話查詢、Token 查詢、timeout vs active-timeout、登入流程 references/02-login-auth.md timeout 與 active-timeout 是兩個獨立機制;v1.29.0+ renewTimeout 可續期
許可權認證、角色認證、StpInterface、萬用字元、RBAC 設計模式 references/03-permission.md 必須實現 StpInterface;後端必須再次校驗;萬用字元 * 代表全通過
註解鑑權(@SaCheck*、SaMode、orRole、@SaIgnore、@SaCheckOr)、註解 vs 路由選型 references/04-annotation.md 必須先註冊 SaInterceptor 否則註解無效;粗粒度用路由、細粒度用註解、可混用
路由攔截鑑權(SaInterceptor / SaRouter / match / free / stop / back)、全域性白名單 references/05-interceptor-route.md SaInterceptor 註冊後註解才生效;路由做白名單 + 註解做細粒度(推薦混用)
Session 會話(Account/Token/Custom)、三大作用域 references/06-session.md SaSession ≠ HttpSession,不可混用
整合 Redis、前後端分離 token 傳遞、Redis 部署模式 references/07-redis-frontsep.md SB3.x 字首 spring.data.redis;前端塞 header,引數名即 tokenName;分散式場景必須
StpUtil 常用 API(登入/踢人/封禁/二級認證/身份切換/多賬號) references/08-api-stputil.md 踢人 vs 登出 vs 頂人場景值不同;kickout 與 disable 不同、封禁需先踢下線
排錯:NotLoginException 場景值、異常碼、註解不生效、跨域、反代 uri、過濾器異常 references/09-pitfalls.md NotLoginException 7 種場景值;過濾器/跨域異常不進 @ExceptionHandler
Agent 常見錯誤與最佳實踐(核心價值,每次生成程式碼前必看) references/10-antipattern.md 28 條 antipattern,生成程式碼前必對照
高階特性:記住我、同端互斥、賬號封禁、二級認證、身份切換、多賬號、密碼加密、Token 風格/字首、全域性偵聽器/過濾器、Http Basic/Digest references/11-advanced.md v1.31.0+ login 不再自動校驗封禁需顯式 checkDisable;記住我本質是 Cookie 持久 vs 臨時(前後端分離需前端控制);同端互斥需 is-concurrent=false + device;二級認證 openSafe+checkSafe(@SaCheckSafe);多賬號推薦 StpKit 門面、LoginType 不可執行時改;Token 字首與值間必須有空格、Cookie 模式需額外配置
SSO 單點登入(三種模式)、OAuth2.0(四種授權模式)、SSO vs OAuth2 選型 references/12-sso-oauth2.md 三種模式選型看前端是否同域+後端是否同 Redis;SSO vs OAuth2 選型;allow-url 生產必須配詳細地址
微服務:分散式 Session、閘道器統一鑑權、內部服務隔離(Same-Token)、依賴引入 references/13-micro-service.md 閘道器用 Reactor 依賴、子服務用 Servlet;SaReactorFilter 全域性過濾器;Redis 必須;Feign 內部呼叫需傳 Same-Token
外掛:JWT、API-Key、API 簽名、AOP 註解、臨時 Token、Alone Redis、SpEL 表示式 references/14-plugin.md JWT 是可選 token 風格(非預設):有狀態場景用 simple-uuid token 風格(不引 JWT)即可;僅當用戶要 JWT 格式時才在 Simple/Mixin/Stateless 中選——Simple=JWT+Redis(推薦),Mixin=JWT+Redis 且登入資料內嵌 Token,Stateless=JWT 無 Redis 不支援踢人;閘道器用 Reactor 依賴

主動行為觸發(程式碼審查護欄)

以下程式碼模式命中時主動提醒使用者;更完整的強制規則見「核心強約束」。

程式碼模式 主動提醒
is-share: true + 需要踢人/頂人下線 is-share=true 時多端共用 token,踢人語義變化,需向用戶說明
SSO allow-url: "*" 生產環境必須配置為詳細 URL(詳見 12-sso-oauth2.md
active-timeout 配了但自動續簽不理解 getLoginId/checkLogin 等呼叫時自動續簽;關閉用 autoRenew=false
Feign 內部呼叫未傳 Same-Token 子服務會拒絕未攜帶 Same-Token 的請求(詳見 13-micro-service.md
@SaCheckDisable 不指定 service 校驗全賬號封禁;分類封禁需指定 service

核心強約束(Agent 必須遵守)

  1. 先註冊攔截器再用註解@SaCheck* 註解依賴 SaInterceptor,預設關閉。必須先 registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**") 註冊,註解才生效。高版本 SpringBoot(≥2.6.x)可能需額外加 @EnableWebMvc
  2. SaSession ≠ HttpSessionStpUtil.getSession() 返回的 SaSessionHttpSession 無任何關係,互不通。用 Sa-Token 時統一使用 SaSession,不要混用。
  3. 許可權校驗後端必須做:前端按鈕級許可權只是輔助顯示,後端介面必須用 StpUtil.checkPermission()@SaCheckPermission 再次校驗。
  4. 實現 StpInterface 才能鑑權:許可權/角色校驗依賴 StpInterface 實現類(@Component),返回許可權碼和角色集合。不實現則所有許可權/角色校驗通過。
  5. timeout vs active-timeout 獨立timeout 是長久有效期(預設 30 天),active-timeout 是最低活躍頻率(超時凍結)。兩者獨立,任一過期 token 不可用。-1 代表永久/不限制。
  6. 踢人 vs 登出 vs 頂人不同logout=正常退出;kickout=被動踢下線(場景值 -5);replaced=被頂下線(場景值 -4)。is-shareis-concurrent 配置影響行為。
  7. 封禁需先踢下線StpUtil.disable(id, time) 不會自動讓已登入使用者下線。需先 StpUtil.kickout(id)disable。v1.31.0+ login() 不再自動校驗封禁,需顯式 checkDisable
  8. Starter 不可混用sa-token-spring-boot-starter(Servlet)和 sa-token-reactor-spring-boot-starter(Reactor)不可同時引入同一專案。
  9. 前後端分離需手動傳 token:Cookie 模式自動注入;前後端分離(App/小程式)需後端返回 SaTokenInfo,前端塞 header(引數名即 tokenName,預設 satoken)。
  10. 過濾器異常不進 @ExceptionHandlerSaServletFilter / SaReactorFilter 中丟擲的異常不進入 Spring 全域性異常處理器,必須通過 .setError() 處理。
  11. Redis 字首注意版本:SpringBoot 2.x 用 spring.redis.*,SpringBoot 3.x 用 spring.data.redis.*。配錯導致連線失敗。
  12. JWT 是可選 token 風格,與有狀態/無狀態正交:有狀態場景預設用 Sa-Token 原生 simple-uuid token 風格 + Redis 即可,無需引入 JWT;僅當用戶要 JWT 自包含/可讀格式時引入 sa-token-jwt(Simple 模式,JWT + Redis)。無狀態場景必須 JWT(StpLogicJwtForStateless,不要 Redis,不支援踢人/active-timeout)。Mixin 才同時需要 JWT + Redis(登入資料內嵌 Token)。不要預設假設用 JWT。

關鍵決策檢查點(生成程式碼前必須確認)

以下場景存在多條技術路線,Agent 不可擅自替使用者選擇。須先簡要說明選項差異,確認方向後再編碼。

# 觸發訊號 必須確認的問題 選項差異 預設推薦(使用者未指定時)
C1 使用者提到 "JWT" / "無狀態" / "不要 Redis" / "水平擴充套件" / "token 風格" / "自包含 token" ① 是否要無狀態(不依賴 Redis)?② 是否要 JWT 風格 token(自包含/可讀)? 有狀態 + simple-uuid token(預設,最常用):Redis 存會話,無需 JWT,功能完整(踢人/Session/active-timeout)
有狀態 + JWT(Simple):JWT 自包含 token + Redis,功能完整
無狀態(Stateless):必須 JWT,不要 Redis,不支援踢人/Session/active-timeout
Mixin:JWT + Redis,登入資料內嵌 Token,不支援踢人/頂人
有狀態 + simple-uuid token;使用者已顯式宣告"無狀態/不要 Redis"視為已確認,直接 Stateless
C2 使用者提到 "SSO" / "單點登入" ① 各子系統前端是否同域?② 各子系統後端是否共享同一 Redis? 模式一:前端同域 + 後端同 Redis → 共享 Cookie
模式二:前端不同域 + 後端同 Redis → URL 重定向 + Ticket
模式三:前端不同域 + 後端不同 Redis → HTTP 請求校驗
按條件自動判定(同域同 Redis → 模式一)
C3 使用者提到 "登入" / "認證"(未明確前後端分離) ① 前端是瀏覽器渲染頁面,還是 App/小程式/SPA?② 是否前後端分離? Cookie 模式:瀏覽器自動管理,login() 後自動注入
Header 模式:前後端分離,後端返回 tokenValue,前端塞 header
Cookie(瀏覽器);Header(前後端分離/App/小程式)
C4 使用者提到 "鑑權" / "許可權" / "保護介面" ① 需要粗粒度(路徑級)還是細粒度(介面/方法級)?② 是否有全域性白名單? 路由攔截:SaInterceptor + SaRouter,粗粒度,路徑匹配
註解:@SaCheck,細粒度,方法級
混用*:路由做白名單 + 註解做細粒度(推薦)
混用(路由全域性 + 註解細粒度)
C5 使用者提到 "微服務" / "閘道器" ① 是否需要無狀態(不依賴 Redis)?② 是否需要踢人/active-timeout? Redis 方案:有狀態,支援踢人/active-timeout/Session(推薦)
JWT Stateless:無狀態,不依賴 Redis,但不支援踢人/active-timeout
Redis 方案(功能完整)
C6 使用者提到 "多賬號" / "多體系" / "多端" ① 需要幾套獨立登入體系?② 各體系是否需要不同 timeout/配置? StpKit 門面模式:每個體系獨立 StpLogic,可獨立配置
單賬號 + device 引數:同一體系區分裝置型別
按體系數量決定(≥2 套 → StpKit)

執行規則: 1. 檢測到觸發訊號 → 先向使用者提出確認問題,不要直接生成程式碼。 2. 使用者未明確回答 → 使用「預設推薦」列的策略,但在輸出中標註"未確認,已使用預設方案"。 3. 使用者確認方向 → 按選擇生成程式碼,不再追問。 4. 一個需求命中多個檢查點 → 逐一確認,全部完成後一次性生成程式碼。

使用流程

  1. 確認適用性:先執行「第 0 步:依賴探測與啟用分支」,再對照「何時使用本技能」;依賴缺失時主動詢問是否引入 Sa-Token,不適用 → 告知使用者並建議退出。
  2. 關鍵決策檢查點:查表命中觸發訊號 → 先向使用者確認方向,不要直接生成程式碼
  3. 定位 reference:查「決策路由」表,讀對應檔案。
  4. 編碼前看 antipattern:必讀 10-antipattern.md 對照常見錯誤。
  5. 編碼遵循強約束:先讀 12 條核心強約束,再給程式碼。
  6. 遇異常先查排錯references/09-pitfalls.md
  7. 輸出前自檢:對照 12 條核心強約束逐項核對——starter 版本對應(2/3/4.x)、檢查點已確認方向、@SaCheck* 已註冊 SaInterceptor、前後端分離已返回 tokenValue、SaSession 未與 HttpSession 混用、Redis 字首對應版本、踢人前置 kickout 再 disable、過濾器已配 setError、JWT 僅在使用者要 JWT 格式或無狀態時引入(預設 simple-uuid)。

    發現更多技能外掛,請訪問7w4.net。

版本注意

  • 前向相容:核心 API 保持向後相容;新版本 API 簽名變更以官方 StpUtil 原始碼為準,本 skill 未覆蓋的新增功能參考 sa-token.cc 官方文件。
  • sa-token-jwt 顯式依賴 hutool-jwt,hutool 5.8.13/5.8.14 存在型別轉換問題,建議避開。

🤖 AI 評測

這個 Skill 對 Java 許可權認證開發很有幫助,文件結構清晰、內容全面,核心約束和常見錯誤總結實用,能有效避免踩坑,版本差異說明也很細緻。不過複雜場景的解釋有時不夠直接,搜尋定位特定問題不夠便捷,整體易用性還有提升空間。總體是個好幫手,但使用體驗可以做得更好。

📊 多維度評分

適應性4.8
規範性4.7
有效性4.8
可靠性4.6
可信度5

📁 包含檔案 (15 個)

📄 SKILL.md 16 KB
📄 references/01-setup.md 4.2 KB
📄 references/02-login-auth.md 4.2 KB
📄 references/03-permission.md 5.2 KB
📄 references/04-annotation.md 4.3 KB
📄 references/05-interceptor-route.md 4.1 KB
📄 references/06-session.md 3.9 KB
📄 references/07-redis-frontsep.md 4.1 KB
📄 references/08-api-stputil.md 3.4 KB
📄 references/09-pitfalls.md 5.4 KB
📄 references/10-antipattern.md 13.2 KB
📄 references/11-advanced.md 18.2 KB
📄 references/12-sso-oauth2.md 13.3 KB
📄 references/13-micro-service.md 8.3 KB
📄 references/14-plugin.md 11.3 KB