测试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
相关产品推荐
相关产品推荐

