Как правильно сопоставить вложенные утверждения OpenID Connect (OIDC) с полномочиями Spring Security 6?JAVA

Программисты JAVA общаются здесь
Anonymous
Как правильно сопоставить вложенные утверждения OpenID Connect (OIDC) с полномочиями Spring Security 6?

Сообщение Anonymous »

Я переношу приложение Spring Boot 3.2 с пользовательского сервера аутентификации на Keycloak. В моей предыдущей настройке я использовал плоский список ролей в JWT. Однако Keycloak вкладывает роли в объект realm_access
.

Код: Выделить всё

{
"sub": "12345",
"realm_access": {
"roles": ["admin", "user"]
}
}
Я использую DSL oauth2ResourceServer. По умолчанию Spring Security ищет префикс SCOPE_ в утверждении области, но не «видит» мои вложенные роли Keycloak.
Моя текущая конфигурация безопасности следующая:

Код: Выделить всё

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/admin/**").hasRole("admin") // This always returns 403
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));

return http.build();
}
  • Я попытался создать собственный GrantedAuthoritiesMapper, но кажется, что JwtAuthenticationConverter уже переопределяет логику до того, как он туда доберется.
  • Я попробовал установить Spring.security.oauth2.resourceserver.jwt.authorities-claim-name=realm_access.roles в application.yml, но Spring, похоже, не поддерживает точечную нотацию для вложенных утверждений «из коробки».
Каков идиоматический способ «Spring Security 6» извлечь эти вложенные утверждения и преобразовать их в ROLE_ префикс полномочий, чтобы .hasRole("admin") работал правильно? Должен ли я полностью заменить JwtAuthenticationConverter или есть более чистый способ предоставить собственный экстрактор утверждений?

Вернуться в «JAVA»