Spring Boot考试门户JWT认证问题:Token获取失败+权限异常
问题解决方案
1. JwtAuthenticationFilter无法从请求Header获取JWT Token
先排查以下核心点:
- 确认请求Header格式是否合规:必须是
Authorization: Bearer <你的JWT Token>,很多场景会漏掉Bearer前缀,或者把Header键名写成非标准的auth-token之类的,导致Filter无法识别。 - 检查
JwtAuthenticationFilter的Header读取逻辑:
如果你的代码直接读取Authorization值却没处理前缀,或者键名写错,就拿不到有效Token。正确的处理逻辑示例:String authHeader = request.getHeader("Authorization"); String jwtToken = null; if (authHeader != null && authHeader.startsWith("Bearer ")) { // 截取掉"Bearer "前缀,拿到真正的Token内容 jwtToken = authHeader.substring(7); } - 验证Filter是否正确加入Spring Security过滤链:在
SecurityConfig里要确保JwtAuthenticationFilter被添加到UsernamePasswordAuthenticationFilter之前,否则请求不会经过该Filter处理。
2. java.lang.IllegalArgumentException: "A granted authority textual representation is required"
这个异常是因为创建GrantedAuthority实例时传入了null或空字符串,重点排查:
- 检查
User类实现UserDetails的getAuthorities()方法:
如果用户关联的Role对象为null,或者Role的名称(roleName)为空,转换为SimpleGrantedAuthority时就会触发该异常。修改代码过滤空值:@Override public Collection<? extends GrantedAuthority> getAuthorities() { return this.roles.stream() // 过滤掉null角色和空角色名称的情况 .filter(role -> role != null && StringUtils.isNotBlank(role.getRoleName())) .map(role -> new SimpleGrantedAuthority(role.getRoleName())) .collect(Collectors.toList()); } - 检查
JwtUtil的Token权限解析逻辑:如果从Token的Claims中读取权限列表,要确保每个权限字符串都非空,避免将null传入SimpleGrantedAuthority构造方法。 - 确认数据库中的用户角色数据:检查是否存在角色名称为null或空字符串的记录,这会导致加载权限时出现异常。
建议优先从上述核心代码逻辑入手排查,应该能定位并解决问题。
内容的提问来源于stack exchange,提问作者user22721581
相关产品推荐
相关产品推荐

