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

测试JwtGrantedAuthoritiesConverter时转换结果为空求排查

问题排查与修复方案

核心问题分析

  • Claim名称不匹配:你给JwtGrantedAuthoritiesConverter设置了setAuthoritiesClaimName("roles"),指定从Jwt的roles字段读取权限,但构造测试用Jwt时,传入的claim是scope(值为"message:read message:write")。转换器找不到roles字段,自然返回空集合。
  • 断言逻辑错误:Assert.assertTrue(authorities.contains("roles"))是无效的,因为authorities是Collection<GrantedAuthority>集合,存储的是对象而非字符串,直接用字符串判断包含关系会失败。

修复方案

根据你的预期结果(获取message:read和message:write权限),有两种修复方式:

方式一:修正转换器的Claim名称配置

保持Jwt的scope字段不变,将转换器的authoritiesClaimName改回scope(或者不设置,因为默认值就是scope):

@Test
void convertWithOverriddenGrantedAuthoritiesConverter() {
    Jwt jwt = this.jwt(Collections.singletonMap("scope", "message:read message:write"));
    JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
    jwtGrantedAuthoritiesConverter.setAuthorityPrefix("");
    // 移除setAuthoritiesClaimName("roles"),或改为setAuthoritiesClaimName("scope")
    Collection<GrantedAuthority> authorities = jwtGrantedAuthoritiesConverter.convert(jwt);

    assertThat(authorities).containsExactly(
            new SimpleGrantedAuthority("message:read"),
            new SimpleGrantedAuthority("message:write"));
    // 移除错误的断言,或根据实际需求调整
}

方式二:修改测试用Jwt的Claim字段

保持转换器的roles配置,构造Jwt时传入roles字段:

@Test
void convertWithOverriddenGrantedAuthoritiesConverter() {
    // 将claim的key改为"roles",值保持权限字符串
    Jwt jwt = this.jwt(Collections.singletonMap("roles", "message:read message:write"));
    JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter = new JwtGrantedAuthoritiesConverter();
    jwtGrantedAuthoritiesConverter.setAuthorityPrefix("");
    jwtGrantedAuthoritiesConverter.setAuthoritiesClaimName("roles");
    Collection<GrantedAuthority> authorities = jwtGrantedAuthoritiesConverter.convert(jwt);

    assertThat(authorities).containsExactly(
            new SimpleGrantedAuthority("message:read"),
            new SimpleGrantedAuthority("message:write"));
    // 若要验证是否包含某个权限,需用GrantedAuthority对象
    // Assert.assertTrue(authorities.contains(new SimpleGrantedAuthority("message:read")));
}

内容的提问来源于stack exchange,提问作者Narjess

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:10:15