web-dev-qa-db-ja.com

Spring Security Configuration @Order not unique exception

Spring Security Configurationに複数のフィルターを登録しようとしましたが、常に同じ例外が発生します。

04-Nov-2015 14:35:23.792警告[RMI TCP Connection(3)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refreshコンテキストの初期化中に例外が発生しました-更新試行のキャンセルorg.springframework.beans.factory.BeanCreationException:「org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration」という名前のBeanの作成エラー:自動配線された依存関係の挿入に失敗しました;ネストされた例外はJava.langです。 IllegalStateException:WebSecurityConfigurersの@Orderは一意である必要があります。順序100はすでに使用されているため、com.payment21.webapp.MultiHttpSecurityConfig $ ApiWebSecurityConfigurationAdapter $$ EnhancerBySpringCGLIB $$ 35c79fe4 @ 1d381684でも使用できません。

私の試みはうまくいかなかったので、 Spring Security reference に示されているとまったく同じコードを試しました。

@EnableWebSecurity
public class MultiHttpSecurityConfig {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) { 
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
    }

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

    @Configuration                                                   
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin();
        }
    }
}

エラーを特定するために、web.xmlをJavaベースのアプローチで置き換えようとしましたが、どちらも機能しませんでした。何が間違っているのかわかりません。ドキュメントが間違っていますか?アプリケーションが構成を台無しにしますか?2番目のWebSecurityConfigAdapterを登録しない限り、システムは正常に起動します。

これらは私の依存関係です:

compile 'org.springframework:spring-webmvc:4.2.2.RELEASE'
compile 'org.springframework:spring-messaging:4.2.2.RELEASE'
compile 'org.springframework:spring-websocket:4.2.2.RELEASE'
compile 'org.springframework:spring-aop:4.2.2.RELEASE'
compile'javax.servlet:javax.servlet-api:3.0.1'
compile 'org.springframework.security:spring-security-web:4.0.3.RELEASE'
compile 'org.springframework.security:spring-security-config:4.0.3.RELEASE'
17
Journeycorner

エラーが見つかりました...スニペットにインポートを投稿する人はいません。マルチモジュールプロジェクトのセットアップを使用していますが、IntelliJはSpringアノテーションを認識せず、使用しました

org.Apache.logging.log4j.core.config.Order

の代わりに

org.springframework.core.annotation.Order

Springは正しい注釈を解析しなかったため、両方の構成でデフォルト値100を想定していました。

8
Journeycorner

注目に値するかもしれませんが、@ Orderアノテーションはクラスレベルである必要があります。 @Journeycornerの構成はマルチクラスの例であるため、これは少しわかりにくいです。インポートの私の例:)

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import com.someco.entity.User;
import com.someco.service.SpringDataJpaUserDetailsService;

@Configuration("CustomSecurityConfig")
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(1000)                                                        
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
private SpringDataJpaUserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .userDetailsService(this.userDetailsService)
            .passwordEncoder(User.PASSWORD_ENCODER);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/built/**", "/main.css").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .defaultSuccessUrl("/", true)
            .permitAll()
            .and()
        .httpBasic()
            .and()
        .csrf().disable()
        .logout()
            .logoutSuccessUrl("/");
}

}
13
Paul Lungu

通常、この例外は、同じBeanが2回解決されるときに発生します。たとえば、@Configurationファイルは、同じBeanを解決するapplicationContext.xmlをインポートします。アプリケーションが起動を開始すると(この場合、MultiHttpSecurityConfig)2回登録しようとすると、このエラーが発生します。

XMLからBean定義を削除するエラーを解決しました。

7
A. Saladino

@ EnableWebSecurityアノテーションを使用して別のクラスにアノテーションを付けた可能性があります。このアノテーションを実装できるクラスは1つだけです。それが役立つことを願っています!

4
Guchelkaben

2番目のWebSecurityConfigurerAdapterに@Order(1000)を置くとうまくいきました

2
Deepak Kumar

たぶん、@ EnableWebSecurity注釈を使用して別のクラスに注釈を付けた可能性があります。このアノテーションを実装できるクラスは1つだけです。それが役立つことを願っています!

package com.ie.springboot.configuaration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("mkyong").password("123456").roles("USER");
        auth.inMemoryAuthentication().withUser("admin").password("{noop}123456").roles("ADMIN");
        auth.inMemoryAuthentication().withUser("dba").password("123456").roles("DBA");

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .antMatchers("/*").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
                .and().formLogin();
        http.csrf().disable();

    }
}
1

私は最近同じ問題に遭遇しましたが、正しい方向に私を向ける答えをどこにも見つけることができませんでした。最終的にgitの履歴をたどってステップをたどり、クラスに@RefreshScopeアノテーションを追加することだけが変更されたことがわかりました。

@RefreshScopeアノテーションを削除することで、アプリケーションは機能しました。

1
George Davies

この説明をセキュリティ構成に追加すると、私の問題は解決しました。

@Configuration("MySecurityConfig")
public class MySecurityConfig extends WebSecurityConfigurerAdapter
0
Arun

同じ問題があり、@ Configurationアノテーションをクラスレベルに移動するこのエラーを解決しました。

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
0
Sampath T

Spring構成のどこかに@order(100)注釈を使用した構成がある可能性があります。 @order(100)注釈を削除するか、他の順序値を指定してください。

0
Imrank