Spring Boot接口鉴权为什么选JWT方案
Spring Boot后端开发里,接口鉴权最常用的方案是JWT(JSON Web Token)。JWT把用户身份与权限信息签进一个自包含令牌,服务端不需要会话存储,非常适合无状态、水平扩容的微服务架构。相比Session方案,JWT天然支持跨域、移动端、网关转发,缺点是签发后无法主动吊销,需要配合有效期和刷新机制弥补。
Spring Security认证过滤器链配置与JWT校验流程
核心流程:客户端登录成功后拿到access_token,后续请求在Authorization头带Bearer token,服务端过滤器拦截解析、验签、塞进SecurityContext,放行到接口。
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/auth/login", "/auth/refresh").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated())
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
}
jwtAuthFilter解析Authorization头:无头放行,有头则调JwtService解析,解析成功把用户信息封装为Authentication放进SecurityContextHolder,接口里用@AuthenticationPrincipal或SecurityContext取用户。
JWT刷新令牌机制与AccessToken过期的处理
access_token设短有效期(如15-30分钟),refresh_token设长有效期(如7天),refresh_token只走单独的刷新接口且存入服务端(Redis)以便吊销。刷新流程:
// 刷新令牌核心逻辑(简化)
public TokenPair refresh(String refreshToken) {
// 1. 解析并校验 refresh_token 签名与过期
// 2. 校验 Redis 中存在该 token(未被吊销)
// 3. 签发新的 access_token 和 refresh_token
// 4. 旧 refresh_token 删除,新的写入 Redis
}
客户端401时自动调刷新接口拿新令牌重放原请求,避免用户被迫重新登录。安全注意:refresh_token必须和客户端绑定(存指纹),防泄漏被滥用。
JWT密钥管理与令牌吊销方案
签名密钥用RS256非对称加密更稳妥,私钥放服务端配置,公钥给网关/其他服务验签。吊销场景用Redis存blacklist:令牌验签通过后再查黑名单,黑名单命中则拒绝。用户改密码、被踢下线、风控封禁时写入黑名单。短token过期快,黑名单数据量大,可以只对剩余有效期长的token做吊销记录。
Spring Boot接口鉴权常见问题排查
常见问题:过滤器放行后接口仍被拦截(授权配置顺序写错);JWT过期时间用秒还是毫秒单位搞混导致立刻失效(jjwt要求Date);SecurityContext里塞的不是Authentication而是自定义对象导致拦截器取不到用户。调试优先看过滤器执行顺序(日志级别开DEBUG),确认自定义Filter确实注册进去了,再检查JWT解析异常被吞掉的情况——注意捕获ExpiredJwtException单独抛401,SignatureException单独抛401,不要统一返回500。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/springboot-jie-kou-jian-quan-shi-zhan-jwt-ling-pai-ren/