ContiNew
认证

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 / CUSTOMDEFAULT
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,要求容器中存在 RedissonClient Bean(通常经缓存模块 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 不变)。属修复方向的变化,无需使用方处理。

跨版本升级建议通知用户重新登录,避免存量会话数据带来的边界问题。

目录