Sa-Token 实战:如何解决 cn.dev33.satoken.exception.NotLoginException 未读取到有效 Token 问题

1次阅读
没有评论

共计 2070 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

1. Sa-Token 认证流程与 Token 机制简介

Sa-Token 是一个轻量级 Java 权限认证框架,其核心思想是通过 Token 实现会话管理。Token 本质上是服务器颁发给客户端的一个凭证,用于标识用户身份。框架默认采用 JWT 形式存储 Token,但支持灵活扩展。

Sa-Token 实战:如何解决 cn.dev33.satoken.exception.NotLoginException 未读取到有效 Token 问题

认证流程分为三步:

  1. 用户登录成功后,服务器生成 Token 并返回给客户端
  2. 客户端后续请求携带该 Token
  3. 服务端验证 Token 有效性,通过后允许访问

NotLoginException 是框架在检测到无效 Token 时抛出的运行时异常,通常意味着认证流程中断。

2. NotLoginException 触发场景深度分析

2.1 Token 过期

这是最常见场景。Sa-Token 默认 Token 有效期为 30 天(v1.30.0),可通过配置修改:

// 设置 Token 有效期,单位:秒
SaManager.getConfig().setTimeout(60 * 60 * 24 * 7); // 7 天 

过期后框架会抛出异常,源码中对应 StpLogic.checkLogin() 方法的时间校验逻辑。

2.2 跨域问题

当前后端分离架构下,若未正确配置 CORS,可能导致:

  • 浏览器无法存储 Token
  • 请求未携带 Token
  • 预检请求失败

2.3 多端登录冲突

当同一账号在不同设备登录时,默认配置会踢掉前一个登录态。可通过以下配置改为共存:

// 允许同一账号并发登录
SaManager.getConfig().setIsConcurrent(true);

3. 解决方案与实现

3.1 Token 自动续期方案

适用场景 :需要延长用户活跃会话的场景

// 配置自动续期(框架内置功能,只需开启)SaManager.getConfig().setAutoRenew(true);

// 自定义续期策略
@Component
public class CustomTokenRenew implements SaTokenAction {
    @Override
    public void renewTimeout(Object loginId, String tokenValue, long timeout) {
        // 仅当剩余时间不足 50% 时续期
        if(timeout < SaManager.getConfig().getTimeout()/2) {StpUtil.renewTimeout(loginId, timeout);
        }
    }
}

注意事项
– 频繁续期会增加 Redis 压力
– 敏感操作应强制重新认证

3.2 多端登录适配方案

适用场景 :支持用户多设备同时在线

// 配置不同端互不干扰(示例:PC 端和移动端)StpUtil.getStpLogic("pc").setIsConcurrent(true);
StpUtil.getStpLogic("mobile").setIsConcurrent(true);

// 获取当前设备类型
String device = request.getHeader("Device-Type");
StpUtil.login(userId, device); // 按设备类型登录 

3.3 自定义 Token 解析

适用场景 :需要兼容旧系统或特殊 Token 格式

// 实现自定义 Token 生成与解析
public class CustomTokenTemplate implements SaTokenTemplate {
    @Override
    public String createToken(Object loginId, String device) {return "CustomPrefix-" + UUID.randomUUID();
    }

    @Override
    public Object parseToken(String token) {if(!token.startsWith("CustomPrefix-")) {throw NotLoginException.INVALID_TOKEN;}
        return token.substring(12);
    }
}

// 注册自定义实现
SaManager.setSaTokenTemplate(new CustomTokenTemplate());

4. 生产环境避坑指南

  1. Token 存储策略
  2. 生产环境务必使用 Redis 等集中存储
  3. 避免本地缓存导致集群环境下会话不一致

  4. 续期机制

  5. 敏感操作(如支付)前强制检查 Token 新鲜度
  6. 设置最大续期次数防止无限延长会话

  7. 安全防护

  8. 启用 Token 签名校验(默认开启)
  9. 定期轮换签名密钥

  10. 监控报警

  11. 监控 NotLoginException 发生频率
  12. 异常突增时及时排查

  13. 降级方案

  14. 准备 OAuth2 等备用认证方案
  15. 核心链路允许临时令牌补发

5. 延伸思考

  1. 如何实现基于地理位置的安全认证?当检测到登录地变更时,是否应该强制重新认证?
  2. 在微服务架构下,如何优化 Token 的校验性能?是否可以采用局部校验 + 异步全量校验的组合方案?
  3. 对于超高并发系统,如何设计 Token 的黑名单 / 灰名单机制?

通过本文的分析和解决方案,开发者应该能够有效处理 Sa-Token 中的认证异常。框架的灵活设计允许我们根据实际业务需求定制认证策略,这是其相比传统安全框架的优势所在。

正文完
 0
评论(没有评论)