Sa-Token
Sa-Token 框架的扩展集成:登录拦截器样板化注册、内存 / Redisson / 自定义可切换持久层、JWT 模式与内置前后端分离默认配置。
continew-starter-auth-satoken 针对 Sa-Token 框架做扩展集成:Sa-Token 是一个轻量级 Java 权限认证框架,解决登录认证、权限认证、单点登录、OAuth2.0、分布式 Session 会话、微服务网关鉴权等权限相关问题。
引入依赖
<dependency>
<groupId>top.continew.starter</groupId>
<artifactId>continew-starter-auth-satoken</artifactId>
</dependency>模块自动配置以 sa-token.extension.enabled=true 为生效条件(见 SaTokenAutoConfiguration),开启后完成以下样板化处理:
- 注册全局登录拦截器
SaInterceptor:对全部请求执行StpUtil.checkLogin(),放行路径由sa-token.extension.security.excludes配置; - 引入
sa-token-jackson3使 Sa-Token 内部 JSON 操作基于 Jackson 3(经 SPI 自动加载)。注意不要同时引入 Jackson 2 侧的sa-token-jackson插件:Sa-Token 1.45.0 起会把 SPI 目录下的插件全部加载,实际生效哪一个取决于 classpath 顺序。1.46.0 起 Session 对象反序列化还受全局类型白名单约束,见下方「1.45 → 1.46 升级须知」; - 提供可切换的持久层(内存 / Redisson / 自定义),见下文「持久层」;
- 提供内置默认配置(
default-auth-satoken.yml):token-prefix: Bearer、is-read-body: true、is-read-header: true、is-read-cookie: false(适合前后端分离模式),如需修改直接在自己的配置中覆盖同名键即可。
添加配置
Sa-Token 本体配置(sa-token.*)遵循 Sa-Token 官方配置项;扩展配置位于 sa-token.extension 下,定义在 top.continew.starter.auth.satoken.autoconfigure.SaTokenExtensionProperties:
--- ### Sa-Token 配置
sa-token:
# Token 名称(同时也是 Cookie 名称)
token-name: Authorization
# Token 有效期(单位:秒,默认 30 天,-1 代表永不过期)
timeout: 86400
# Token 最低活跃频率(单位:秒,默认 -1 不限制;超过此时间未访问系统会被冻结)
active-timeout: 1800
# 是否打开自动续签(每次直接或间接调用 getLoginId() 时进行过期检查与续签)
auto-renew: true
# 是否允许同一账号多地同时登录(为 false 时新登录挤掉旧登录)
is-concurrent: true
# 多人登录同一账号时是否共用一个 Token(为 false 时每次登录新建一个 Token)
is-share: false
# 是否输出操作日志
is-log: false
# JWT 秘钥(开启 JWT 模式时必填)
jwt-secret-key: asdasdasifhueuiwyurfewbfjsdafjk
## 扩展配置
extension:
# 是否启用 Sa-Token 扩展自动配置(默认:false)
enabled: true
# 是否启用 JWT(默认:false,启用后注入 StpLogicJwtForSimple)
jwt-enabled: true
# 持久层类型:DEFAULT(内存,默认)/ REDIS / CUSTOM
dao:
type: REDIS
# 安全配置:排除(放行)路径
security:
excludes:
- /error
# 静态资源
- /*.html
- /*/*.html
- /*/*.css
- /*/*.js
- /websocket/**
# 接口文档相关资源
- /favicon.ico
- /doc.html
- /webjars/**
- /swagger-ui/**
- /swagger-resources/**
- /*/api-docs/**| 配置项 | 说明 | 默认值 |
|---|---|---|
sa-token.extension.enabled | 是否启用 Sa-Token 扩展自动配置 | false |
sa-token.extension.jwt-enabled | 是否启用 JWT(注入 StpLogicJwtForSimple) | false |
sa-token.extension.dao.type | 持久层类型:DEFAULT / REDIS / CUSTOM | DEFAULT |
sa-token.extension.security.excludes | 登录拦截放行路径(Ant 风格) | [] |
旧版配置键 sa-token.extension.enableJwt 对应的属性字段为 jwtEnabled,宽松绑定下 enable-jwt / jwt-enabled 均可生效,建议按源码字段名使用 jwt-enabled。
持久层
sa-token.extension.dao.type 支持三种取值(SaTokenDaoProperties.DaoType):
DEFAULT:使用 Sa-Token 内置内存实现SaTokenDaoDefaultImpl,重启即失效,仅适合本地开发;REDIS:使用SaTokenDaoForRedisson,要求容器中存在RedissonClientBean(通常经缓存模块 Redisson 实现提供),是分布式环境的推荐方式;CUSTOM:自定义持久层。此时必须自行实现cn.dev33.satoken.dao.SaTokenDao接口并注册为 Spring Bean,否则启动即抛出NoSuchBeanDefinitionException。
sa-token:
extension:
dao:
type: CUSTOM@Component
public class MySaTokenDao implements SaTokenDao {
// 实现各读写方法
}自定义拦截器
默认登录拦截器标注了 @ConditionalOnMissingBean,注册自己的 SaInterceptor Bean 即可覆盖:
/**
* SaToken 拦截器配置
*/
@Bean
public SaInterceptor saInterceptor(SaTokenExtensionProperties properties) {
return new SaInterceptor(handle -> SaRouter.match(StringConstants.PATH_PATTERN)
.notMatch(properties.getSecurity().getExcludes())
.check(r -> StpUtil.checkLogin()));
}1.45 → 1.46 升级须知
Sa-Token 1.46.0 修复了 Jackson 反序列化 RCE 漏洞,升级后有三处使用方须知:
- Session 对象反序列化白名单(最重要):1.46.0 起,Session/缓存中自定义对象的反序列化由
cn.dev33.satoken.strategy.SaJsonStrategy的全局类型白名单控制,未注册的类型会被拒绝。往 SaSession 存自定义对象的系统需要注册类型(如SaJsonStrategy.instance.registerAllowType(UserContext.class)),JDK 内置类型已在默认白名单,也支持 SPI 文件扩展。典型场景是经SaSession.getModel读取的登录上下文对象,Redis 持久层下每次请求都会走到。 - loginId 禁止包含冒号:1.46.0 新增
sa-token.allow-login-id-colon配置且默认false,loginId 含冒号的系统升级后登录会直接报错,确有需要时配置sa-token.allow-login-id-colon: true放开。以数值 ID 作为 loginId 的系统(如 ContiNew Admin)不受影响。 - Redisson 持久层行为优化:
SaTokenDaoForRedisson的update改用setAndKeepTTL原子保留原过期时间(修复 TTL 偏移),并新增可指定 Codec 的构造器(默认 StringCodec 不变)。属修复方向的变化,无需使用方处理。
跨版本升级建议通知用户重新登录,避免存量会话数据带来的边界问题。