本文深入探讨基于 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);
}
⚙️ 使用流程
- 用户登录,后端生成包含角色信息的 JWT
- 请求携带 Token,后端解析认证
- Token 剩余有效期低时自动续签
- 无需 Session,实现真正无状态认证
📌 实践建议
- 结合前端 Axios 拦截器,实现
Renew-Token自动替换 - 编写单元与集成测试覆盖续签逻辑
- 定期评估 Token 过期策略,平衡安全与体验
🔚 总结
采用 JWT 自动续签和策略模式支持多角色登录,是构建健壮、灵活安全体系的最佳实践。它有效解决传统 Session 难扩展和登录体验断层的问题,是现代微服务架构的关键组件。
🔗 项目源码地址
- GitHub:gitee.com/codevibe/gr…
- Axios 封装、前后端对接代码已上传,支持一键部署体验
🙋♂️ 如果你觉得这篇文章有帮助:
- 点赞 👍
- 收藏 ⭐
- 评论 💬
- 关注我 👇 获取后续实战内容