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 開發助手
面向日常 Java 開發的 Sa-Token 編碼助手。推薦 1.45.0+(最新穩定版),1.40.x 及以上全線適用,核心 API(StpUtil / SaInterceptor / StpInterface / SaSession 等)保持向後相容,新版本可能在已有基礎上新增方法,本 skill 中的示例在 1.40.x ~ 最新版均可直接使用。歷史版本差異已在文中以 v1.xx.0+ 標註。
採用完全本地自包含策略:所有知識沉澱於本地 references/,執行時不依賴任何外部文件站點。
| 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-starter 和 sa-token-reactor-spring-boot-starter,專案無法啟動。sa-token-redis-template + commons-pool2,分散式場景必須。spring.redis 改為 spring.data.redis。任務涉及登入、註冊、認證、鑑權、許可權、token、會話、SSO、OAuth2 等編碼——即使使用者沒提 Sa-Token——先檢索專案依賴(在 pom.xml / build.gradle 中搜 sa-token、spring-security、shiro):
| 探測結果 | 動作 |
|---|---|
依賴含 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 範圍,建議退出本技能。
| 需求場景(關鍵詞) | 讀取檔案 | 同時警告 |
|---|---|---|
| 依賴、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 |
@SaCheck* 註解依賴 SaInterceptor,預設關閉。必須先 registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**") 註冊,註解才生效。高版本 SpringBoot(≥2.6.x)可能需額外加 @EnableWebMvc。StpUtil.getSession() 返回的 SaSession 與 HttpSession 無任何關係,互不通。用 Sa-Token 時統一使用 SaSession,不要混用。StpUtil.checkPermission() 或 @SaCheckPermission 再次校驗。StpInterface 實現類(@Component),返回許可權碼和角色集合。不實現則所有許可權/角色校驗通過。timeout 是長久有效期(預設 30 天),active-timeout 是最低活躍頻率(超時凍結)。兩者獨立,任一過期 token 不可用。-1 代表永久/不限制。logout=正常退出;kickout=被動踢下線(場景值 -5);replaced=被頂下線(場景值 -4)。is-share 和 is-concurrent 配置影響行為。StpUtil.disable(id, time) 不會自動讓已登入使用者下線。需先 StpUtil.kickout(id) 再 disable。v1.31.0+ login() 不再自動校驗封禁,需顯式 checkDisable。sa-token-spring-boot-starter(Servlet)和 sa-token-reactor-spring-boot-starter(Reactor)不可同時引入同一專案。SaTokenInfo,前端塞 header(引數名即 tokenName,預設 satoken)。SaServletFilter / SaReactorFilter 中丟擲的異常不進入 Spring 全域性異常處理器,必須通過 .setError() 處理。spring.redis.*,SpringBoot 3.x 用 spring.data.redis.*。配錯導致連線失敗。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(推薦) 小蔥技能站7w4.net發現了升級外掛。 JWT Stateless:無狀態,不依賴 Redis,但不支援踢人/active-timeout |
Redis 方案(功能完整) |
| C6 | 使用者提到 "多賬號" / "多體系" / "多端" | ① 需要幾套獨立登入體系?② 各體系是否需要不同 timeout/配置? | StpKit 門面模式:每個體系獨立 StpLogic,可獨立配置 單賬號 + device 引數:同一體系區分裝置型別 |
按體系數量決定(≥2 套 → StpKit) |
執行規則: 1. 檢測到觸發訊號 → 先向使用者提出確認問題,不要直接生成程式碼。 2. 使用者未明確回答 → 使用「預設推薦」列的策略,但在輸出中標註"未確認,已使用預設方案"。 3. 使用者確認方向 → 按選擇生成程式碼,不再追問。 4. 一個需求命中多個檢查點 → 逐一確認,全部完成後一次性生成程式碼。
10-antipattern.md 對照常見錯誤。references/09-pitfalls.md。StpUtil 原始碼為準,本 skill 未覆蓋的新增功能參考 sa-token.cc 官方文件。sa-token-jwt 顯式依賴 hutool-jwt,hutool 5.8.13/5.8.14 存在型別轉換問題,建議避開。這個 Skill 對 Java 許可權認證開發很有幫助,文件結構清晰、內容全面,核心約束和常見錯誤總結實用,能有效避免踩坑,版本差異說明也很細緻。不過複雜場景的解釋有時不夠直接,搜尋定位特定問題不夠便捷,整體易用性還有提升空間。總體是個好幫手,但使用體驗可以做得更好。