如何创建自定义JwtGrantedAuthoritiesConverter以从特定声明中获取角色。
我正在使用Spring Security 6和一个授权服务器来验证不透明的访问令牌。我想根据内省响应中的“access”字段填充权限。
内省React:
{
"username": "user_test",
"scope": "STANDARD",
"access": [
"CUSTOM_ROLE_111",
"CUSTOM_ROLE_222",
"CUSTOM_ROLE_333",
"CUSTOM_ROLE_444",
],
"name": "acessor",
"active": true,
"loginType": "PASSWORD",
"refreshToken": "$2b$10$s...",
"iat": 1692016676,
"exp": 1692103076
}
我试过:
@Bean
public Converter<Jwt, AbstractAuthenticationToken> jwtAuthenticationConverter() {
return jwt -> {
List<GrantedAuthority> authorities = new ArrayList<>();
List<String> accessScopes = jwt.getClaimAsStringList("access");
for (String scope : accessScopes) {
authorities.add(new SimpleGrantedAuthority("SCOPE_" + scope));
}
return new JwtAuthenticationToken(jwt, authorities);
};
}
然后:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth ->
oauth.opaqueToken(opaqueTokenConfigurer ->
opaqueTokenConfigurer.introspector(opaqueTokenIntrospector())));
return http.build();
}
但是根本不起作用。发生多个BeanCreationException
你知道怎么解决吗?
基本上,正如我所理解的,到目前为止,通过创建customJwtGrantedAuthoritiesConvert还需要为JwtDecoder公开一个Bean。从文档到暴露JwtDecoder @Bean,我需要jwk。因为我在使用内省,我没有jwk。
我的日志:2023-08- 15 T15:42:09.555+03:00错误3828 - [ main] o.s.b.d.LoggingFailureAnalysisReporter:
应用程序启动失败
产品描述:
org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration中的方法setFilterChains的参数0需要类型为“org.springframework.security.oauth2.jwt.JwtDecoder”的Bean,但找不到该Bean。
参考:https://docs.spring.io/spring-security/reference/servlet/oauth2/resource-server/jwt.html
1条答案
按热度按时间ni65a41a1#
您还需要声明JWTDecoder bean。
下面的东西..
你也可以使用JwkURI、SecretKey和公钥创建JwtDecoder bean。