springsecurity解析token
时间: 2025-01-18 15:34:37 浏览: 42
### 解析 JWT Token 的方法
在 Spring Security 中解析 JWT Token 主要是通过自定义过滤器完成。为了使应用程序能够理解并验证传入请求中的 JWT,通常会创建一个继承自 `OncePerRequestFilter` 或者特定情况下如提到的 `JWTAuthenticationFilter` 继承于 `UsernamePasswordAuthenticationFilter` 来拦截 HTTP 请求,并从中提取和解码 JWT[^3]。
当接收到带有 Authorization 头部字段(通常是 Bearer 类型)的请求时,该头部包含了 Base64 编码形式的 JSON Web Tokens (JWT),此时需要编写逻辑去读取这个令牌的内容并对其进行校验:
```java
public class JwtAuthorizationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String header = request.getHeader("Authorization");
if (header != null && header.startsWith("Bearer ")) { // 检查是否存在有效的授权头信息
try {
String jwtToken = header.substring(7); // 去掉 "Bearer " 部分获取实际token字符串
Claims claims = Jwts.parser()
.setSigningKey(SignatureAlgorithm.HS256, secretKey.getBytes()) // 使用密钥签名算法HS256以及secret key进行解析
.parseClaimsJws(jwtToken).getBody(); // 获取载荷部分
// 设置身份认证对象到上下文中
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
claims.getSubject(),
null,
getAuthoritiesFromClaim(claims)); // 根据claim构建权限列表
SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (JwtException e) {
logger.error("Invalid token", e);
throw new BadCredentialsException("Invalid token");
}
}
filterChain.doFilter(request, response);
}
private Collection<? extends GrantedAuthority> getAuthoritiesFromClaim(Claims claims){
List<String> roles = (List<String>) claims.get("roles"); // 从claim中取出角色信息
return roles.stream()
.map(role -> new SimpleGrantedAuthority("ROLE_" + role))
.collect(Collectors.toList());
}
}
```
这段代码展示了如何在一个名为 `JwtAuthorizationFilter` 的类里实现对 JWT Token 的解析过程。它首先检查是否有合法的授权头部存在;如果有,则尝试去除前缀 “Bearer ” 并利用指定的秘密密钥来验证此令牌的有效性和完整性。一旦成功解析出有效负载(payload),就会将其转换成适合 Spring Security 使用的身份认证对象,并放置到当前线程的安全上下文环境中以便后续访问控制操作可以识别已登录用户及其拥有的权限[^1]。
阅读全文
相关推荐

















