Несколько HttpSecurity не обрабатываются с помощью oAut2Login - PullRequest
0 голосов
/ 18 июня 2020

Мое приложение, использующее Spring и безопасность 5.2.1 oAuth2, действует как сервер ресурсов и клиент. Эта конфигурация, созданная на основе официальной документации по весенней безопасности, работает не так, как ожидалось. При запросе на api / ** он правильно защищен и действует как сервер ресурсов, но другой URL-адрес не перенаправляет на сервер sso, а на локальную форму входа! Если я удалю ApiWebSecurityConfigurationAdapter, он будет перенаправлен в форму входа sso, но у него нет возможности сервера ресурсов.

Как я могу добиться, чтобы конфигурация работала вместе?

@EnableWebSecurity
public class MultiHttpSecurityConfig {

    public static final String jwkSetUri = "https://<url-oidc>/jwks";

    @Bean                                                             
    public UserDetailsService userDetailsService() throws Exception {
        // ensure the passwords are encoded properly
        UserBuilder users = User.withDefaultPasswordEncoder();
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(users.username("user").password("password").roles("USER").build());
        manager.createUser(users.username("admin").password("password").roles("USER","ADMIN").build());
        return manager;
    }

    @Configuration
    @Order(1)                                                        
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {

       http.antMatcher("/api/**")                               
                .authorizeRequests(authorize -> authorize
                    .anyRequest().hasRole("ADMIN")
                )
       .csrf().disable()
       .formLogin().disable()
       .httpBasic().disable()
       .oauth2ResourceServer().jwt();
    }

    @Configuration                                                   
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
          http.authorizeRequests(authorize -> authorize
                    .anyRequest().authenticated()
                ).csrf().disable()
       .formLogin().disable()
       .httpBasic().disable()
       .oauth2Client()
       .and().oauth2Login();
    }

    @Bean
    public ClientRegistrationRepository clientRegistrationRepository() {
      return new InMemoryClientRegistrationRepository(this.ssoClientRegistration());
    }

    private ClientRegistration ssoClientRegistration() {
      return ClientRegistration
              .withRegistrationId("sso")
              .clientId("id")
              .clientSecret("secret")
              .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
              .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
              .redirectUriTemplate("{baseUrl}/{action}/oauth2/code/{registrationId}")
              .authorizationUri("https://<url-oidc>/authorize")
              .tokenUri("https://<url-oidc>/accessToken")
              .userInfoUri("https://<url-oidc>/profile")
              .jwkSetUri(MultiHttpSecurityConfig.jwkSetUri)
              .clientName("sso").build();

    }
    }
}
...