Sa-Token OAuth2 Server 端二次开发完全指南:SaOAuth2Util 全量 API 与 SaOAuth2Strategy 可重写策略详解
发布时间:2026/9/14 4:13:53 锦皓数字建站

Sa-Token OAuth2 Server 端二次开发完全指南SaOAuth2Util 全量 API 与 SaOAuth2Strategy 可重写策略详解【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token本篇指南面向需要在 Sa-Token OAuth2 Server 端即认证中心/授权服务器进行二次开发的开发者。官方示例只提供了最基础的授权流程和userinfo资源开放当你需要开放更多资源接口、校验 Access-Token、回收凭证、自定义授权页面、扩展 grant_type 或自定义 scope 处理逻辑时就需要用到本文将要系统讲解的SaOAuth2Util全量 API 与SaOAuth2Strategy全部可重写策略。读完本文你将能够熟练使用工具类完成凭证查询、校验与回收并通过重写策略深度定制认证中心的每一处行为。本文对应的原始官方文档为 sa-token-doc/oauth2/oauth2-dev.md核心源码位于 SaOAuth2Util.java 与 SaOAuth2Strategy.java读者可对照阅读。一、二次开发的两大入口工具类与策略类在深入 API 细节之前先明确 Sa-Token-OAuth2 模块提供给二次开发者的两个核心入口它们的职责截然不同入口类名职责源码位置查询/校验/回收 APISaOAuth2Util提供全部静态方法对模板类SaOAuth2Template的薄封装template/SaOAuth2Util.java可重写策略SaOAuth2Strategy提供全部默认行为实现开发者可整体替换strategy/SaOAuth2Strategy.java从源码结构看SaOAuth2Util中的每个静态方法都只是将调用委托给SaOAuth2Manager.getTemplate()返回的模板对象真正的业务逻辑集中在SaOAuth2Template中而SaOAuth2Template又进一步委托给四个可替换的组件SaOAuth2Dao数据持久化、SaOAuth2DataLoader应用信息加载、SaOAuth2DataResolver请求数据解析、SaOAuth2DataGenerate凭证生成。理解这条委托链有助于判断某个能力应该在哪一层扩展二次开发代码 │ ├── SaOAuth2Util静态工具方法查、校验、回收 │ └── SaOAuth2Manager.getTemplate() → SaOAuth2Template │ └── SaOAuth2Manager.getDao() / getDataLoader() / getDataResolver() / getDataGenerate() │ └── SaOAuth2Strategy.instance重写默认行为鉴权加工、凭证生成、认证流程回调 └── 被 SaOAuth2Template 与 DataGenerate 在各关键节点回调委托链的完整实现可参考 SaOAuth2Template.java 与 SaOAuth2Manager.java。二、Client 信息相关 API应用注册信息的查询与校验Client客户端应用是 OAuth2 体系中的第三方应用。二次开发中几乎所有接口的第一步都是拿到并校验 Client 信息。// 获取 ClientModel根据 clientId查不到时返回 null不抛异常 SaOAuth2Util.getClientModel(clientId); // 校验 clientId 信息并返回 ClientModel如果找不到对应 Client 信息则抛出异常 SaOAuth2Util.checkClientModel(clientId); // 校验clientId 与 clientSecret 是否正确不正确则抛出异常 SaOAuth2Util.checkClientSecret(clientId, clientSecret); // 校验clientId 与 clientSecret 是否正确并且是否签约了指定 scopes任一条件不满足则抛出异常 SaOAuth2Util.checkClientSecretAndScope(clientId, clientSecret, scopes); // 判断该 Client 是否签约了指定的 Scope返回 true 或 false不抛异常 SaOAuth2Util.isContractScope(clientId, scopes); // 校验该 Client 是否签约了指定的 Scope如果没有则抛出异常按 clientId 查 SaOAuth2Util.checkContractScope(clientId, scopes); // 校验该 Client 是否签约了指定的 Scope如果没有则抛出异常直接传 ClientModel省一次查询 SaOAuth2Util.checkContractScope(clientModel, scopes); // 校验该 Client 使用指定 url 作为回调地址是否合法不合法则抛出异常 SaOAuth2Util.checkRedirectUri(clientId, url); // 判断指定 loginId 是否对一个 Client 授权给了指定 Scope返回布尔值 SaOAuth2Util.isGrantScope(loginId, clientId, scopes); // 删除指定 loginId 针对指定 Client 的授权信息即解除授权 SaOAuth2Util.deleteGrantScope(loginId, clientId);2.1 底层校验逻辑与异常码从 SaOAuth2Template.java 源码可以看到这些方法的真实行为getClientModel直接委托SaOAuth2Manager.getDataLoader().getClientModel(clientId)数据来源由开发者实现的SaOAuth2DataLoader决定示例实现见 demo 中的SaOAuth2DataLoaderImplcheckClientModel在查不到时抛出SaOAuth2ClientModelException错误码CODE_30105无效 client_idcheckClientSecret在秘钥不匹配时抛出SaOAuth2ClientModelException错误码CODE_30115无效 client_secretcheckContractScope遍历 scopes 逐个检查是否包含在clientModel.contractScopes中缺失时抛出SaOAuth2ClientModelScopeException错误码CODE_30112该 client 暂未签约 scopeisContractScope内部通过 try/catch 捕获checkContractScope的异常来返回布尔值isGrantScope读取SaOAuth2Manager.getDao().getGrantScope(clientId, loginId)的授权记录再用SaFoxUtil.list1ContainList2AllElement判断请求的 scopes 是否全部已授权deleteGrantScope删除 DAO 层保存的用户授权记录。各异常码的完整定义可查阅 SaOAuth2ErrorCode.java。2.2 checkRedirectUri 的安全校验细节建议精读checkRedirectUri是 OAuth2 安全的关键防线源码中包含了四道校验SaOAuth2Template.java先通过SaFoxUtil.isUrl(url)校验是否是一个有效 URL截取掉?之后的查询参数部分禁止 URL 中出现字符及其编码形式%40、%2540——否则攻击者可通过http://sa-oauth-client.com:123evil.com之类的构造绕过 allow-url 白名单造成 code 参数劫持判断 URL 是否命中clientModel.allowRedirectUris允许列表。同时checkRedirectUriListNormal静态方法会对开发者配置的 allow-url 列表本身做合规性检查SaOAuth2Template.java*通配符只允许出现在地址最后一位如http://sa-oauth-client.com:*出现在中间位置如http://*.sa-oauth-client.com/会被判定为无效配置——否则攻击者可构造http://sa-token.com/a.sa-oauth-client.com/绕过校验*出现在末尾时其前一位必须是/或:禁止写成http://domain*的形式——否则攻击者可构造http://sa-oauth-client.com.evil.com/callback绕过校验。这两处安全设计都带有详尽的注释与攻击示例值得二次开发者阅读原文注释避免在自定义回调校验逻辑时引入类似漏洞。三、Code 相关 API授权码的查询与校验授权码Code是授权码模式下第一步授权的产物有效期默认为 5 分钟codeTimeout用于换取 Access-Token。// 获取 CodeModel无效的 code 会返回 null不抛异常 SaOAuth2Util.getCode(code); // 校验 Code成功返回 CodeModel失败则抛出异常 SaOAuth2Util.checkCode(code); // 获取 Code根据索引clientId、loginId即某应用下某用户当前有效的授权码 SaOAuth2Util.getCodeValue(clientId, loginId);getCode/checkCode底层调用SaOAuth2Manager.getDao().getCode(code)checkCode在查不到时抛出SaOAuth2AuthorizationCodeException错误码CODE_30110无效 codeCodeModel承载的字段包括code授权码、clientId应用 id、scopes授权范围、loginId对应账号 id、redirectUri重定向地址、nonce随机数、createTime13 位时间戳创建时间完整定义见 CodeModel.java。四、Access-Token 相关 API访问凭证的全生命周期管理Access-Token 是 OAuth2 中客户端调用资源接口时携带的核心凭证其默认有效期 2 小时accessTokenTimeout。二次开发开放自定义资源接口时这一组 API 使用频率最高。// 获取 AccessTokenModel无效的 AccessToken 会返回 null不抛异常 SaOAuth2Util.getAccessToken(accessToken); // 校验 Access-Token成功返回 AccessTokenModel失败则抛出异常 SaOAuth2Util.checkAccessToken(accessToken); // 获取 Access-Token 列表此应用下对某个用户签发的所有 Access-Token SaOAuth2Util.getAccessTokenValueList(clientId, loginId); // 判断指定 Access-Token 是否具有指定 Scope 列表返回 true 或 false不抛异常 SaOAuth2Util.hasAccessTokenScope(accessToken, ...scopes); // 校验指定 Access-Token 是否具有指定 Scope 列表如果不具备则抛出异常 SaOAuth2Util.checkAccessTokenScope(accessToken, ...scopes); // 获取 Access-Token 所代表的 LoginId登录账号 id SaOAuth2Util.getLoginIdByAccessToken(accessToken); // 获取 Access-Token 所代表的 clientId应用 id SaOAuth2Util.getClientIdByAccessToken(accessToken); // 回收一个 Access-Token SaOAuth2Util.revokeAccessToken(accessToken); // 回收全部 Access-Token指定应用下指定用户的全部 Access-Token SaOAuth2Util.revokeAccessTokenByIndex(clientId, loginId);4.1 各方法底层实现要点checkAccessToken查不到时抛出SaOAuth2AccessTokenException错误码CODE_30106checkAccessTokenScope内部先checkAccessToken再逐个检查at.scopes.contains(scope)缺失时抛出SaOAuth2AccessTokenScopeException错误码CODE_30108hasAccessTokenScope同样通过捕获异常返回布尔值getLoginIdByAccessToken/getClientIdByAccessToken都是对checkAccessToken结果字段的直接读取at.loginId、at.clientId因此传入无效 token 时同样会抛异常revokeAccessToken会先删除凭证本体deleteAccessToken再删除索引deleteAccessTokenIndex_BySingleDataSaOAuth2Template.javarevokeAccessTokenByIndex通过getAccessTokenValueList拿到该用户在该应用下的全部 token 列表逐个删除后删除索引对应源码 L547-L559AccessTokenModel提供了两个实用的剩余有效期方法getExpiresIn()Access-Token 剩余秒数-1表示永不过期、getRefreshExpiresIn()Refresh-Token 剩余秒数。完整字段还包括accessToken、refreshToken、expiresTime、refreshExpiresTime、clientId、loginId、scopes、tokenType、grantType、extraData、createTime见 AccessTokenModel.java。五、Refresh-Token 相关 API刷新凭证的查询与回收Refresh-Token 用于在 Access-Token 过期后静默换取新令牌默认有效期 30 天refreshTokenTimeout。// 获取 RefreshTokenModel无效的 RefreshToken 会返回 null不抛异常 SaOAuth2Util.getRefreshToken(refreshToken); // 校验 Refresh-Token成功返回 RefreshTokenModel失败则抛出异常 SaOAuth2Util.checkRefreshToken(refreshToken); // 获取 Refresh-Token 列表此应用下对某个用户签发的所有 Refresh-Token SaOAuth2Util.getRefreshTokenValueList(clientId, loginId); // 回收一个 Refresh-Token SaOAuth2Util.revokeRefreshToken(refreshToken); // 回收全部 Refresh-Token指定应用下指定用户的全部 Refresh-Token SaOAuth2Util.revokeRefreshTokenByIndex(clientId, loginId); // 根据 RefreshToken 刷新出一个 AccessToken核心方法返回新的 AccessTokenModel SaOAuth2Util.refreshAccessToken(refreshToken);checkRefreshToken查不到时抛出SaOAuth2RefreshTokenException错误码CODE_30111refreshAccessToken委托给SaOAuth2Manager.getDataGenerate().refreshAccessToken(refreshToken)最终由SaOAuth2DataGenerate的默认实现完成销毁旧令牌、签发新令牌的整套流程其中是否在刷新时同时产生新的 Refresh-Token 由isNewRefresh配置控制回收逻辑与 Access-Token 完全对称先删凭证本体、再删单条索引revokeRefreshToken或按 clientId loginId 批量回收revokeRefreshTokenByIndex。六、Client-Token 相关 API凭证式Client Credentials专用凭证Client-Token 服务于 OAuth2 凭证式模式对应配置项enableClientCredentials它只代表客户端应用本身不绑定具体用户因此按 clientId 维度管理默认有效期 2 小时clientTokenTimeout。// 获取 ClientTokenModel无效的 ClientToken 会返回 null不抛异常 SaOAuth2Util.getClientToken(clientToken); // 校验 Client-Token成功返回 ClientTokenModel失败则抛出异常 SaOAuth2Util.checkClientToken(clientToken); // 获取 Client-Token 列表此应用下签发的所有 Client-Token注意不需要 loginId 参数 SaOAuth2Util.getClientTokenValueList(clientId); // 判断指定 Client-Token 是否具有指定 Scope 列表返回 true 或 false SaOAuth2Util.hasClientTokenScope(clientToken, ...scopes); // 校验指定 Client-Token 是否具有指定 Scope 列表如果不具备则抛出异常 SaOAuth2Util.checkClientTokenScope(clientToken, ...scopes); // 回收一个 ClientToken SaOAuth2Util.revokeClientToken(clientToken); // 回收全部 Client-Token指定应用下的全部 Client-Token SaOAuth2Util.revokeClientTokenByIndex(clientId);checkClientToken查不到时抛出SaOAuth2ClientTokenException错误码CODE_30107checkClientTokenScope缺失 scope 时抛出SaOAuth2ClientTokenScopeException错误码CODE_30109索引维护按clientId单维度进行deleteClientTokenIndex_BySingleData、deleteClientTokenIndex与 Access-Token / Refresh-Token 的clientId loginId双维度索引形成对比。七、请求查询 API从当前请求中直接读取凭证当资源接口需要直接从当前 HTTP 请求中解析凭证时可以使用这两个方法它们会依次尝试请求参数与请求头两种携带方式// 数据读取从当前请求对象中读取 access_token并查询到 AccessTokenModel 信息无效 access_token 抛出异常 // 1、请求参数 access_token 2、请求头 Authorization: Bearer access_token SaOAuth2Util.currentAccessToken(); // 数据读取从当前请求对象中读取 client_token并查询到 ClientTokenModel 信息无效 client_token 抛出异常 // 1、请求参数 client_token 2、请求头 Authorization: Bearer client_token SaOAuth2Util.currentClientToken();其实现SaOAuth2Template.java是先用SaOAuth2Manager.getDataResolver().readAccessToken(SaHolder.getRequest())从请求对象中解析出 token 字符串再交给checkAccessToken/checkClientToken完成查询与校验。也就是说解析规则参数名、请求头格式由SaOAuth2DataResolver决定校验规则由模板方法决定两部分都可以按需定制。实战示例开放一个自定义 userinfo 资源接口下面这段代码取自官方示例 SaOAuth2ResourcesController.java完整演示了读取凭证 → 获取账号 → 校验 scope → 返回用户数据的标准流程是二次开发开放新资源接口的模板RestController public class SaOAuth2ResourcesController { // 示例获取 userinfo 信息昵称、头像、性别等等 RequestMapping(/oauth2/userinfo) public SaResult userinfo() { // 获取 Access-Token 对应的账号id String accessToken SaOAuth2Manager.getDataResolver().readAccessToken(SaHolder.getRequest()); Object loginId SaOAuth2Util.getLoginIdByAccessToken(accessToken); System.out.println(-------- 此Access-Token对应的账号id: loginId); // 校验 Access-Token 是否具有权限: userinfo SaOAuth2Util.checkAccessTokenScope(accessToken, userinfo); // 模拟账号信息真实环境需要查询数据库获取信息 MapString, Object map new LinkedHashMap(); // map.put(userId, loginId); 一般原则下oauth2-server 不能把 userId 返回给 oauth2-client map.put(nickname, 林小林); map.put(avatar, http://xxx.com/1.jpg); map.put(age, 18); map.put(sex, 男); map.put(address, 山东省 青岛市 城阳区); return SaResult.ok().setMap(map); } }参照此模式开放任意新接口只需三步checkAccessTokenScope校验权限 → 从AccessTokenModel或 DAO 中读取业务数据 → 返回结果。八、SaOAuth2StrategyOAuth2 Server 端全部可重写策略SaOAuth2Strategy.instance是全局单例包含全部默认行为实现。重写某个字段即可替换对应环节的默认逻辑。下面按原文档的分类逐一说明。8.1 权限处理器Scope 加工这一组策略负责根据 token 携带的 scope 列表对凭证模型进行加工典型场景是给 token 填充 openid、unionid、userid 等派生字段// 根据 scope 信息对一个 AccessTokenModel 进行加工处理签发 Access-Token 时执行 SaOAuth2Strategy.instance.workAccessTokenByScope at - { // at 为 AccessTokenModel可通过 at.scopes 判断后向 at.extraData 填充扩展数据 // ... }; // 当使用 RefreshToken 刷新 AccessToken 时根据 scope 信息对一个 AccessTokenModel 进行加工处理 SaOAuth2Strategy.instance.refreshAccessTokenWorkByScope at - { // ... }; // 根据 scope 信息对一个 ClientTokenModel 进行加工处理 SaOAuth2Strategy.instance.workClientTokenByScope ct - { // ct 为 ClientTokenModel // ... };从源码看默认实现并不是简单地空操作而是维护了一个scopeHandlerMap权限处理器集合SaOAuth2Strategy.java遍历 token 的 scopes从scopeHandlerMap中取出对应的SaOAuth2ScopeHandlerInterface处理器并调用。默认注册了四个处理器对应CommonScope常量OPENID→OpenIdScopeHandlerUNIONID→UnionIdScopeHandlerUSERID→UserIdScopeHandlerOIDC→OidcScopeHandler同时框架预留了_FINALLY_WORK_SCOPE特殊 key 作为最终兜底处理器。开发者既可以直接重写上面三个策略字段实现整体替换也可以调用registerScopeHandler(...)/removeScopeHandler(...)注册或移除单个 scope 处理器demo 中提供了自定义UserinfoScopeHandler、CustomOidcScopeHandler的示例位于sa-token-demo/sa-token-demo-oauth2/sa-token-demo-oauth2-server/src/main/java/com/pj/oauth2/custom_scope/目录。注意refreshAccessTokenWorkByScope与workAccessTokenByScope的默认行为存在差异前者只会调用refreshAccessTokenIsWork()返回 true 的处理器用于区分首次签发与刷新签发两种场景下的加工差异。8.2 grant_type 处理器grantTypeAuth是 OAuth2 Server 处理换取 token请求的总入口默认实现已经完成了相当完整的校验链路// 根据 grantType 构造一个 AccessTokenModel SaOAuth2Strategy.instance.grantTypeAuth req - { // req 为 RequestAuthModel包含 grant_type、client_id、client_secret、scope 等参数 // 默认实现执行流程见源码 L186-L215 // 1. 校验 grant_type 是否在 grantTypeHandlerMap 中注册否则抛 CODE_30126 // 2. 校验全局开关 enableAuthorizationCode / enablePassword 是否打开 // 3. 校验 clientSecret 与 scope 是否合法checkClientSecretAndScope // 4. 检测该应用 allowGrantTypes 是否包含此 grant_type否则抛 CODE_30141 // 5. 调用对应的 grantTypeHandler.getAccessToken(req, clientId, scopes) 构建 token // ... };与 scope 处理器类似默认注册了三个 grant_type 处理器见registerDefaultGrantTypeHandlerauthorization_code授权码、password密码式、refresh_token刷新。二次开发可通过registerGrantTypeHandler(...)/removeGrantTypeHandler(...)扩展自定义 grant_type官方 demo 的sa-token-demo-oauth2-server中提供了PhoneCodeGrantTypeHandler手机验证码登录与CustomPasswordGrantTypeHandler两个可直接参考的自定义示例。8.3 凭证创建自定义凭证值生成算法默认情况下code、Access-Token、Refresh-Token、Client-Token 的值均由SaFoxUtil.getRandomString(60)生成 60 位随机字符串。如果你的业务要求特定的 token 格式如 JWT 风格、带业务前缀可重写这四个策略// 创建一个 code value SaOAuth2Strategy.instance.createCodeValue (clientId, loginId, scopes) - { // 自定义生成逻辑例如return CODE- 自定义随机串; // ... }; // 创建一个 AccessToken value SaOAuth2Strategy.instance.createAccessToken (clientId, loginId, scopes) - { // ... }; // 创建一个 RefreshToken value SaOAuth2Strategy.instance.createRefreshToken (clientId, loginId, scopes) - { // ... }; // 创建一个 ClientToken value注意参数没有 loginId因为 Client-Token 不绑定用户 SaOAuth2Strategy.instance.createClientToken (clientId, scopes) - { // ... };需要说明的是Sa-Token 的 JWT 集成能力由sa-token-jwt插件提供并可通过SaOAuth2Strategy凭证创建策略与 OAuth2 模块结合使用相关插件文档见 sa-token-doc/plugin/jwt-extend.md。8.4 认证流程回调自定义登录与授权页面这一组策略控制未登录跳转、授权确认页、登录校验、授权前检查四个交互节点是定制认证中心前端体验的核心// OAuth-Server端未登录时返回的View // 默认返回字符串当前会话在 OAuth-Server 认证中心尚未登录 SaOAuth2Strategy.instance.notLoginView () - { // 可返回自定义页面内容或通过 SaHolder.getResponse().redirect(...) 跳转登录页 // ... }; // OAuth-Server端确认授权时返回的View // 默认返回字符串本次操作需要用户授权 SaOAuth2Strategy.instance.confirmView (clientId, scopes) - { // 可读取 clientId、scopes 渲染动态授权确认页面 // ... }; // OAuth-Server端登录函数 // 默认返回 SaResult.error()即默认拒绝一切登录 SaOAuth2Strategy.instance.doLoginHandle (name, pwd) - { // 示例校验用户名密码后执行 StpUtil.login(账号id)并返回 SaResult.ok() // ... }; // OAuth-Server端用户在授权指定 client 前的检查如果检查不通过请直接抛出异常 SaOAuth2Strategy.instance.userAuthorizeClientCheck (loginId, clientId) - { // 示例if(被禁止的应用) throw new SaOAuth2Exception(该应用已被禁止授权); // ... };官方示例的SaOAuth2ServerH5Controller与 H5 前端页面位于sa-token-demo/sa-token-demo-oauth2/下完整演示了如何重写notLoginView、confirmView、doLoginHandle构建一套可用的登录/授权 H5 界面二次开发时可直接对照改造。8.5 其它SaClientModel 默认字段设置最后一个策略用于在创建SaClientModel时填充其默认字段值默认实现从全局配置SaOAuth2ServerConfig读取各类超时时间与数量上限// 在创建 SaClientModel 时设置其默认字段 SaOAuth2Strategy.instance.setSaClientModelDefaultFields (clientModel) - { // 默认实现源码 L279-L288 // clientModel.accessTokenTimeout config.getAccessTokenTimeout(); // clientModel.refreshTokenTimeout config.getRefreshTokenTimeout(); // clientModel.clientTokenTimeout config.getClientTokenTimeout(); // clientModel.maxAccessTokenCount config.getMaxAccessTokenCount(); // clientModel.maxRefreshTokenCount config.getMaxRefreshTokenCount(); // clientModel.maxClientTokenCount config.getMaxClientTokenCount(); // clientModel.isNewRefresh config.getIsNewRefresh(); // ... };SaClientModel的完整字段集SaClientModel.java包括clientId、clientSecret、contractScopes签约权限、allowRedirectUris允许回调地址、allowGrantTypes允许的授权模式、subjectId主体 id、各类超时与数量上限字段以及isAutoConfirm是否自动确认授权源码注释明确标注为高危配置禁止向不被信任的第三方开启。这些字段正是上一节中checkContractScope、checkRedirectUri、grantTypeAuth等校验所依赖的数据。九、配置项默认值速查表SaOAuth2ServerConfigSaOAuth2ServerConfig.java中与本篇 API 相关的默认值汇总如下二次开发时应明确这些默认行为配置项默认值说明codeTimeout300 秒5 分钟Code 授权码有效期accessTokenTimeout7200 秒2 小时Access-Token 全局默认有效期refreshTokenTimeout2592000 秒30 天Refresh-Token 全局默认有效期clientTokenTimeout7200 秒2 小时Client-Token 全局默认有效期maxAccessTokenCount12单应用单用户最多并存 Access-Token 数maxRefreshTokenCount12单应用单用户最多并存 Refresh-Token 数maxClientTokenCount12单应用最多并存 Client-Token 数isNewRefreshfalse刷新 Access-Token 时是否同时生成新 Refresh-TokenenableAuthorizationCode/enableImplicit/enablePassword/enableClientCredentials均 true四种授权模式的总开关十、总结Sa-Token OAuth2 Server 端的二次开发能力可以归纳为两条主线查、校验、回收走SaOAuth2Util静态 API覆盖 Client 信息、Code、Access-Token、Refresh-Token、Client-Token 五大对象的完整生命周期管理配合currentAccessToken()/currentClientToken()可直接从当前请求解析凭证。这些方法底层统一委托给SaOAuth2Template再由 DAO / DataLoader / DataResolver / DataGenerate 四个可替换组件分工实现因此既可以直接调用也可以深入到组件层做更大范围的定制。改行为走SaOAuth2Strategy.instance策略字段从 scope 加工、grant_type 处理、凭证值生成到登录/授权页面回调共 11 个可重写策略覆盖了授权服务器的全部关键行为节点scope 与 grant_type 还支持通过registerScopeHandler/registerGrantTypeHandler进行模块化扩展demo 中即提供了自定义 scope 处理器与自定义 grant_type 处理器的完整示例。建议二次开发前先通读 SaOAuth2Util.java 与 SaOAuth2Strategy.java 的源码注释再结合 SaOAuth2ServerController.java 与 SaOAuth2ResourcesController.java 两个官方示例对照实践即可快速构建出自定义程度较高的 OAuth2 认证中心。OAuth2 Server 的整体架构与部署说明可进一步参考 sa-token-doc/oauth2/oauth2-server.md 与 sa-token-doc/oauth2/oauth2-apidoc.md。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。