12

によって制御されるメソッドレベルのアノテーションを使用してアプリケーションをセットアップする際に問題が発生しています。@EnableGlobalMethodSecurity使用しているサーブレット 3.0 スタイルの初期化

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

    public SecurityWebApplicationInitializer() {
        super(MultiSecurityConfig.class);
    }
}

AuthenticationManager私は、独自の問題で両方を初期化する2つの異なる方法を試みました。を使用しない@EnableGlobalMethodSecurityと、サーバーが正常に起動し、すべてのフォーム セキュリティが期待どおりに実行されることに注意してください。コントローラーに注釈を追加する@EnableGlobalMethodSecurityと、問題が発生します。@PreAuthorize("hasRole('ROLE_USER')")

フォームベースと API ベースのセキュリティを個別に設定しようとしています。メソッド ベースのアノテーションは、API セキュリティに対してのみ機能する必要があります。

1つの構成は次のとおりです。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class MultiSecurityConfig {

    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http.antMatcher("/api/**").httpBasic();
        }

        protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
        }
    }

    @Configuration
    public static class FormWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/static/**","/status");
        }

        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().hasRole("USER").and()
                .formLogin().loginPage("/login").permitAll();
        }

        protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
        }
    }

}

認証メカニズムの登録を 1 つだけにしたいので、これは理想的ではありませんが、主な問題は、次の例外が発生することです。

java.lang.IllegalArgumentException: Expecting to only find a single bean for type interface org.springframework.security.authentication.AuthenticationManager, but found []

私が知る限り@EnableGlobalMethodSecurity、独自にセットアップするAuthenticationManagerので、ここで何が問題なのかわかりません。

2 番目の構成は次のとおりです。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class MultiSecurityConfig {

    @Bean
    protected AuthenticationManager authenticationManager() throws Exception {
        return new AuthenticationManagerBuilder(ObjectPostProcessor.QUIESCENT_POSTPROCESSOR)
                .inMemoryAuthentication()
                    .withUser("user").password("password").roles("USER").and()
                    .withUser("admin").password("password").roles("USER", "ADMIN").and()
                    .and()
                .build();
    }

    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        @Override protected void configure(HttpSecurity http) throws Exception {
            http.antMatcher("/api/**").httpBasic();
        }
    }

    @Configuration
    public static class FormWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/static/**","/status");
        }

        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests().anyRequest().hasRole("USER").and()
                .formLogin().loginPage("/login").permitAll();
        }
    }

}

この構成は実際には正常に開始されますが、例外があります

java.lang.IllegalArgumentException: A parent AuthenticationManager or a list of AuthenticationProviders is required
at org.springframework.security.authentication.ProviderManager.checkState(ProviderManager.java:117)
at org.springframework.security.authentication.ProviderManager.<init>(ProviderManager.java:106)
at org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder.performBuild(AuthenticationManagerBuilder.java:221)

テストすると、セキュリティが機能しないことがわかりました。

私はこれを数日間見てきましたが、春のセキュリティ実装コードに飛び込んだ後でも、構成の何が問題なのかを見つけることができないようです.

spring-security-3.2.0.RC1 と spring-framework-3.2.3.RELEASE を使用しています。

4

1 に答える 1