十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Sa-Token 自定义 Token 风格完全指南:六种内置样式与 createToken 策略重写实战

Sa-Token 自定义 Token 风格完全指南:六种内置样式与 createToken 策略重写实战 Sa-Token 自定义 Token 风格完全指南六种内置样式与 createToken 策略重写实战【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token本篇技术指南聚焦 Sa-Token 权限认证框架的 Token 生成风格定制默认情况下框架以 UUID 作为登录凭证而你只需一行配置即可切换为随机字符串、tik 风格等内置样式甚至可以重写框架策略类SaStrategy的createToken算法实现完全自定义的 Token 生成规则。读完本文你将掌握sa-token.token-style全部取值及其背后的源码实现、配置文件的三种写法以及一套可直接复制运行的自定义 Token 生成策略并理解改了不生效这类问题的根因。一、Token 在 Sa-Token 中的角色与生成时机Sa-Token 是轻量级 Java 权限认证框架其核心模型是登录成功后由框架生成一段不透明字符串即 Token返回给前端前端后续请求携带该 Token框架据此识别登录身份。因此Token 的生成算法直接决定了凭证的形态、长度与安全特征。从源码调用链看StpUtil.login(...)最终会走到StpLogic的createTokenValue方法public String createTokenValue(Object loginId, String deviceType, long timeout, MapString, Object extraData) { return SaStrategy.instance.createToken.apply(loginId, loginType); }即Token 的实际生成逻辑被抽象为SaStrategy.instance.createToken这个策略函数框架内置了基于tokenStyle配置的默认实现也允许开发者整体替换。这条调用链定义于 StpLogic.java理解它是掌握本文全部内容的前提。二、内置 Token 风格六种取值一览Sa-Token 默认的 Token 生成策略是 uuid 风格模样类似于623368f0-ae5e-4475-a53f-93e4225f16ae。如果对这种风格不满意只需在配置文件里设置sa-token.token-style风格类型即可切换内置六种取值如下对应原文完整示例值// 1. token-styleuuid —— uuid风格 (默认风格) 623368f0-ae5e-4475-a53f-93e4225f16ae // 2. token-stylesimple-uuid —— 同上uuid风格, 只不过去掉了中划线 6fd4221395024b5f87edd34bc3258ee8 // 3. token-stylerandom-32 —— 随机32位字符串 qEjyPsEA1Bkc9dr8YP6okFr5umCZNR6W // 4. token-stylerandom-64 —— 随机64位字符串 v4ueNLEpPwMtmOPMBtOOeIQsvP8z9gkMgIVibTUVjkrNrlfra5CGwQkViDjO8jcc // 5. token-stylerandom-128 —— 随机128位字符串 nojYPmcEtrFEaN0Otpssa8I8jpk8FO53UcMZkCP9qyoHaDbKS6dxoRPky9c6QlftQ0pdzxRGXsKZmUSrPeZBOD6kJFfmfgiRyUmYWcj4WU4SSP2ilakWN1HYnIuX0Olj // 6. token-styletik —— tik风格 gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__各风格特性归纳如下token-style 取值说明长度字符构成uuidUUID 标准格式含 4 个中划线默认风格3616 进制字符 -simple-uuidUUID 去掉中划线的紧凑形态3216 进制字符random-32随机 32 位字符串32大小写字母 数字random-64随机 64 位字符串64大小写字母 数字random-128随机 128 位字符串128大小写字母 数字tik形如xx_xxxxxxxxxxxxxx_xxxxxxxxxxxxxxxx__的分段风格34三段随机串 _连接符其中 tik 风格在源码中的拼装规则为2 位随机串 _ 14 位随机串 _ 16 位随机串 __即2_14_16结构见 SaStrategy.java。1. 三种配置写法token-style属于SaTokenConfig配置项可通过 yml、properties 或 Java 代码任意一种方式设置# application.yml sa-token: token-style: random-32# application.properties sa-token.token-stylerandom-32// Java 代码方式例如在配置类中 SaManager.getConfig().setTokenStyle(random-32);该配置项在 SaTokenConfig.java 中定义默认值为uuid完整配置清单可参考 配置文件说明。2. 内置风格的底层实现SaStrategy的默认createToken实现是一个基于tokenStyle的 switch 分支见 SaStrategy.javapublic SaCreateTokenFunction createToken (loginId, loginType) - { // 根据配置的tokenStyle生成不同风格的token String tokenStyle SaManager.getStpLogic(loginType).getConfigOrGlobal().getTokenStyle(); switch (tokenStyle) { case SaTokenConsts.TOKEN_STYLE_UUID: // uuid return UUID.randomUUID().toString(); case SaTokenConsts.TOKEN_STYLE_SIMPLE_UUID: // 简单uuid (不带下划线) return UUID.randomUUID().toString().replaceAll(-, ); case SaTokenConsts.TOKEN_STYLE_RANDOM_32: // 32位随机字符串 return SaFoxUtil.getRandomString(32); case SaTokenConsts.TOKEN_STYLE_RANDOM_64: // 64位随机字符串 return SaFoxUtil.getRandomString(64); case SaTokenConsts.TOKEN_STYLE_RANDOM_128: // 128位随机字符串 return SaFoxUtil.getRandomString(128); case SaTokenConsts.TOKEN_STYLE_TIK: // tik风格 (2_14_16) return SaFoxUtil.getRandomString(2) _ SaFoxUtil.getRandomString(14) _ SaFoxUtil.getRandomString(16) __; default: // 默认还是uuid SaManager.getLog().warn(配置的 tokenStyle 值无效{}仅允许以下取值: uuid、simple-uuid、random-32、random-64、random-128、tik, tokenStyle); return UUID.randomUUID().toString(); } };风格名称常量统一定义在 SaTokenConsts.javaTOKEN_STYLE_UUID、TOKEN_STYLE_SIMPLE_UUID、TOKEN_STYLE_RANDOM_32、TOKEN_STYLE_RANDOM_64、TOKEN_STYLE_RANDOM_128、TOKEN_STYLE_TIK常量与配置字符串一一对应。3. 随机串的强度基于 CSPRNG三种 random 风格与 tik 风格都依赖工具方法SaFoxUtil.getRandomString(length)见 SaFoxUtil.java。其实现从 62 个字符大小写字母 数字的字符池中逐位取样随机源使用SecureRandom即密码学安全伪随机数生成器CSPRNG线程安全且可静态共享源码第 45-46 行声明。这意味着即使换成随机字符串风格Token 依然具备足够的不可预测性可用于登录凭证场景。4. 无效配置值的回退行为从上述 switch 的default分支可以看出一个容易被忽略的行为当token-style被设置为合法值之外的字符串时框架不会抛异常而是打印一条 warn 日志并回退到 uuid 风格。这一行为同时被单元测试覆盖见 SaStrategyTest.java测试逐一切换六种风格并断言长度/形态如simpleUuid长度为 32 且不含-、tik以__结尾最后设置invalid-style断言回退结果仍包含-即 UUID。如果你想用测试来验证自己的配置是否生效这是现成的参考用例。三、自定义 Token 生成策略重写 SaStrategy.createToken如果以上六种风格都不是你喜欢的类型Sa-Token 允许完全自定义 Token 生成策略——只需重写策略类SaStrategy的createToken算法即可。这是框架策略模式能力的体现SaStrategy统一定义了框架内关键逻辑算法创建 Token、创建 Session、路由匹配、CORS 处理等全部支持按需替换。1. 参考步骤配置类中重写第一步在SaTokenConfigure配置类中添加代码Configuration public class SaTokenConfigure { /** * 重写 Sa-Token 框架内部算法策略 */ PostConstruct public void rewriteSaStrategy() { // 重写 Token 生成策略 SaStrategy.instance.createToken (loginId, loginType) - { return SaFoxUtil.getRandomString(60); // 随机60位长度字符串 }; } }第二步再次调用StpUtil.login(10001)方法进行登录观察其生成的 token 样式gfuPSwZsnUhwgz08GTCH4wOgasWtc3odP4HLwXJ7NDGOximTvT4OlW19zeLH如上例所示重写后登录得到的 Token 是 60 位随机字符串说明自定义策略已生效。2. 策略函数的签名与等价写法createToken是一个函数式接口SaCreateTokenFunction签名接收两个参数loginId当前登录的账号 idloginType账号类型多账号体系下区分登录场景如login、admin。除了直接对字段赋值框架还提供了setCreateToken连缀式方法二者等价且setXxx返回SaStrategy自身便于链式调用多个重写见 SaStrategy.javaSaStrategy.instance .setCreateToken((loginId, loginType) - SaFoxUtil.getRandomString(60)) .setCreateSession((sessionId) - new SaSession(sessionId));注意SaStrategy是全局单例public static final SaStrategy instance重写策略会影响整个应用的 Token 生成行为请确保在应用启动早期如PostConstruct完成重写。3. 登录参数对生成结果的影响自定义策略虽然接管了生成算法但唯一性校验与最大重试次数仍由框架负责。在StpLogic中登录流程会先经过generateUniqueToken包装见 StpLogic.javareturn SaStrategy.instance.generateUniqueToken.execute( token, maxTryTimes, () - createTokenValue(...), token - ...);generateUniqueToken的默认实现见 SaStrategy.java会循环生成 Token → 若maxTryTimes -1直接返回不校验唯一性→ 否则查库确认 Token 未被占用才返回 → 循环maxTryTimes次仍未成功则抛出SaTokenException生成算法过于简单或资源池已耗尽。maxTryTimes默认值为 12见 SaTokenConfig.java因此即使自定义算法出现小概率重复框架也会自动重试保证唯一你可以放心自定义。4. 踩坑提示改完不生效::: warning 更改了 token 生成策略但是不生效 把 Redis 中的旧数据清除掉再试试 :::原因在于Sa-Token 采用Token 即 key的存储模型登录后 Token 会被写入 Sa-Token 的持久化层内存 Map 或 Redis旧 Token 只要未过期就一直有效。因此切换风格/策略只影响之后新创建的 Token想让改动立即全局生效需要清除存储中的旧数据如清空 Redis 中相关 key、重启内存模式的应用前端同时丢弃本地缓存的旧 TokenCookie/LocalStorage/Header若使用 Redis 集成还需确认序列化层如 sa-token-redis-jackson、sa-token-redisson与你的缓存淘汰策略避免旧 key 残留。四、源码级问答进一步理解 Token 风格机制Q1token-style 配置在哪读取SaStrategy默认实现通过SaManager.getStpLogic(loginType).getConfigOrGlobal().getTokenStyle()读取即优先取该loginType的独立配置取不到再回退到全局配置支持多账号体系下不同登录类型使用不同 Token 风格。Q2自定义策略能拿到登录上下文吗可以。createToken的入参loginId、loginType正是当前登录上下文的关键信息你可以基于它们做差异化生成例如不同loginType返回不同长度或不同前缀的 Token。Q3Token 风格与 token-prefix 是什么关系二者职责不同token-style决定 Token本体的生成形态而token-prefix是提交 Token 时约定的固定前缀如Bearer xxxx与 token 本身无关。前者控制生成什么样后者控制怎么提交/识别。Q4换成短随机串安全吗random-3232 位、62 字符集理论空间为 62^32配合generateUniqueToken的唯一性校验在常规业务场景下足够安全若对安全性有更高要求可选用random-64/random-128或按上文方案自定义更长更复杂的算法。五、总结本文完整覆盖了 Sa-Token Token 风格的三个层次开箱即用六种内置风格一行配置切换、深度定制重写SaStrategy.instance.createToken算法、原理透底switch 分发、CSPRNG 随机源、generateUniqueToken唯一性兜底、无效值回退与旧数据缓存问题。从 SaStrategy.java 到 StpLogic.java再到 SaStrategyTest.java 中的测试用例一条完整的配置 → 策略 → 生成 → 校验链路清晰可查。无论你的诉求是换个好看的 Token 格式还是接入公司统一的安全随机串规范本文的配置与代码均可直接复制落地。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表