You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:42:15