基于 JWT 的无状态权限体系设计:自动续签与多角色策略实现

88 阅读2分钟

本文深入探讨基于 Spring Security 与 JWT 的无状态认证体系,详解如何实现 Token 自动续签机制、白名单放行、以及策略模式支持多角色登录,提升系统安全与用户体验。


🎯 设计目标

  • 无状态认证,提升系统扩展性
  • Token 自动续签,保证登录体验流畅
  • 多角色策略动态分发,实现业务解耦
  • 白名单放行,提高系统访问灵活性

🧱 核心代码片段

1. JwtAuthenticationFilter 续签逻辑

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String token = resolveToken(request);
    if (token != null && validate(token)) {
        Authentication auth = getAuthentication(token);
        SecurityContextHolder.getContext().setAuthentication(auth);

        if (shouldRenew(token)) {
            String newToken = createToken(auth);
            response.setHeader("Renew-Token", newToken);
        }
    }
    filterChain.doFilter(request, response);
}
  • 判断 Token 剩余有效期,低于阈值自动续签
  • 新 Token 通过响应头下发,前端负责替换

2. 多角色登录策略

public interface LoginStrategy {
    JwtUser loadUserByUsername(String username);
}

public class AdminLoginStrategy implements LoginStrategy { /* 实现细节 */ }
public class UserLoginStrategy implements LoginStrategy { /* 实现细节 */ }

@Service
public class RoleStrategyContext {
    private final Map<String, LoginStrategy> strategyMap;
    
    public JwtUser login(String role, String username) {
        return strategyMap.get(role).loadUserByUsername(username);
    }
}
  • 通过角色动态选择登录策略,实现模块解耦

3. 白名单路径放行

private static final List<String> WHITE_LIST = List.of("/login", "/refresh-token", "/public");

@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
    return WHITE_LIST.stream().anyMatch(request.getServletPath()::startsWith);
}

⚙️ 使用流程

  1. 用户登录,后端生成包含角色信息的 JWT
  2. 请求携带 Token,后端解析认证
  3. Token 剩余有效期低时自动续签
  4. 无需 Session,实现真正无状态认证

📌 实践建议

  • 结合前端 Axios 拦截器,实现 Renew-Token 自动替换
  • 编写单元与集成测试覆盖续签逻辑
  • 定期评估 Token 过期策略,平衡安全与体验

🔚 总结

采用 JWT 自动续签和策略模式支持多角色登录,是构建健壮、灵活安全体系的最佳实践。它有效解决传统 Session 难扩展和登录体验断层的问题,是现代微服务架构的关键组件。

🔗 项目源码地址


🙋‍♂️ 如果你觉得这篇文章有帮助:

  • 点赞 👍
  • 收藏 ⭐
  • 评论 💬
  • 关注我 👇 获取后续实战内容