web-dev-qa-db-ja.com

異なるAuthenticationProvidersで複数のWebSecurityConfigurerAdapterを使用する(APIの基本認証とWebアプリのLDAP)

Spring Security Referenceセクション5.7 によると、複数のセキュリティアダプタを定義できるはずです。

私は同じことをしようとしますが、成功しません。サーバーの再起動後、最初のx回のAPIは基本認証で問題なく機能しますが、数回ログイン(フォーム)ページにリダイレクトされた後、これはWebアプリでのみ発生し、API呼び出しでは発生しません。

私のコード:

@EnableWebSecurity
public class MultiHttpSecurityConfig  {

    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

        @Autowired
        private Environment env;

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication().
                withUser("admin").password("pw_test").roles(API_ROLE);
        }

        protected void configure(HttpSecurity http) throws Exception {
            http
              .antMatcher("/services/**")
              .authorizeRequests()
              .anyRequest().hasRole(API_ROLE)
              .and()
              .httpBasic()
              .and()
              .csrf()
              .disable();
        }
    }

    @Configuration
    @Order(2)
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Autowired
        private Environment env;

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
            auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());
            auth.eraseCredentials(false);
        }

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            // LDAP FORM AUTHENTICATION
            http.authorizeRequests()
                .antMatchers("/login.html").permitAll()
                .antMatchers("/css/**").permitAll() 
                .antMatchers("/js/**").permitAll() 
                .antMatchers("/images/**").permitAll() 
                .anyRequest().authenticated()
            .and().formLogin()
                .failureUrl("/login.html?error=1")
                .loginPage("/login.html")
                .loginProcessingUrl("/j_spring_security_check")
                .defaultSuccessUrl("/success.html")
                .usernameParameter("j_username")
                .passwordParameter("j_password")
                .permitAll();

            http.csrf().disable();

            // iFRAMES SETTINGS
            http
                .headers()
                .frameOptions().sameOrigin()
                .httpStrictTransportSecurity().disable();

            // HTTPS
            http
                .requiresChannel()
                .anyRequest()
                .requiresSecure();

            //MAP 8080 to HTTPS PORT
            http.portMapper().http(8080).mapsTo(443);
        }

        @Bean
        public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {
            CustomLdapAuthenticationProvider provider = new CustomLdapAuthenticationProvider(env.getProperty("ldap.domain"), env.getProperty("ldap.url"), env.getProperty("ldap.base"));
            provider.setConvertSubErrorCodesToExceptions(true);
            provider.setUseAuthenticationRequestCredentials(true);
            return provider;
        }
    }
}

何か案が?

Spring Bootバージョン1.4.1-RELEASEとSpring Securityバージョン4.1.3-RELEASEを使用しています。

14
Dimi

同じ AuthenticationManager を自動配線するため、両方の構成で同じ AuthenticationManagerBuilder を使用します。

Spring Security Architecture を参照してください:

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    ... // web stuff here

    @Autowired
    public initialize(AuthenticationManagerBuilder builder, DataSource dataSource) {
        auth.jdbcAuthentication().dataSource(dataSource).withUser("dave")
            .password("secret").roles("USER");
    }

}

この例はWebアプリケーションに関連していますが、AuthenticationManagerBuilderの使用はより広く適用できます(Webアプリケーションのセキュリティの実装方法の詳細については、以下を参照してください)。 AuthenticationManagerBuilder@Autowired@Beanのメソッドに含まれることに注意してください。これにより、グローバル(親)AuthenticationManagerが構築されます。対照的に、次のようにした場合:

@Configuration
public class ApplicationSecurity extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    ... // web stuff here

    @Override
    public configure(AuthenticationManagerBuilder builder) {
        auth.jdbcAuthentication().dataSource(dataSource).withUser("dave")
            .password("secret").roles("USER");
    }

}

(構成プログラムでメソッドの@Overrideを使用)、AuthenticationManagerBuilderは、グローバルローカルの子である「ローカル」AuthenticationManagerを構築するためにのみ使用されます。

9
dur