Spring OAuth2 OIDC — получение информации о пользователе и информации о группе AD для авторизации

Я новичок в Spring boot и Spring Security. У меня есть проект микросервиса, использующий Spring boot. И в моем шлюзовом приложении я использую OAuth2 для аутентификации. Поставщик аутентификации принадлежит моей организации и является реализацией OIDC.

Я использую сервер ресурсов oauth2 для аутентификации токена-носителя путем настройки свойств jwk-set-uri и jwk-set-uri .

  • весна-загрузка-стартер-веб => 2.6.7
  • spring-boot-starter-oauth2-resource-server => 2.6.7
  • пружинная безопасность => 5.6.3

приложение.свойства

      spring.security.oauth2.resourceserver.jwt.issuer-uri=https://<org-auth-url>.com
spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://<org-auth-url>/<jwk-uri>

С приведенной выше конфигурацией аутентификация работает нормально. Поэтому я также не добавлял никаких классов конфигурации безопасности. Но для авторизации и другой обработки, например для получения пользовательских данных в контроллере, мне нужна информация о пользователе и сведения о группе AD.

У меня есть URL-адрес конечной точки информации о пользователе. И когда я тестирую его в почтовом клиенте, ответ содержит информацию о пользователе вместе с группами AD.

Как получить данные пользователя для авторизации?

1 ответ

Хорошо.

Вы уже добавили требуемый uri. Хороший.

Теперь вам нужно добавить некоторые настройки:

      @Configuration
@EnableWebSecurity
public class OAuth2ResourceServerSecurityConfiguration {

    @Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
    String jwkSetUri;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        
        http
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers(HttpMethod.GET, 
                     ///// more your requestMatchers ///// 

                        .anyRequest().authenticated()
                )
                .oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
        
        return http.build();
    }

    @Bean
    JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withJwkSetUri(this.jwkSetUri).build();
    }

}

Теперь вы сможете получать утверждения jwt в своих контроллерах с аннотацией @AuthenticationPrincipal.

      @RestController
public class YourController {

    @GetMapping("/")
    public String doAnything(@AuthenticationPrincipal Jwt jwt) {
        return jwt.getSubject();
    }
}

Пожалуйста, добавьте больше информации, и я постараюсь объяснить это лучше :-)

==== UPD ====

Действительно полезный официальный мануал по этому поводу.

Официальные образцы кода