2015-11-04 49 views
3

我試着在我的春季安全配置來註冊多個過濾器,但我總是得到相同的異常:春季安全配置@Order不是唯一的例外

04 - 11月 - 2015年14:35:23.792警告[RMI TCP連接(3)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refresh 異常上下文初始化過程中遇到 - 消除 刷新嘗試 org.springframework.beans.factory.BeanCreationException:錯誤 創建名稱爲 的bean'org.springframework.security.config.annotation.web.confi guration.WebSecurityConfiguration': 注入自動裝配依賴失敗;嵌套的異常是 java.lang.IllegalStateException:WebSecurityConfigurers上的@Order必須是唯一的 。 100的訂單已被使用,所以它不能用於 com.payment21.webapp.MultiHttpSecurityConfig$ApiW[email protected]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的方法,但它也沒有工作。我不知道什麼是錯,文件是錯的?我的應用程序中的某些東西可能與配置混亂嗎?系統正常啓動,除非我註冊第二個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' 

回答

3

我發現錯誤... noone曾經在snippets中發佈導入。我們使用了多模塊項目設置,和IntelliJ不承認春天註釋和使用

org.apache.logging.log4j.core.config.Order

代替

org.springframework.core.annotation.Order

由於春節不解析正確的註解,它假設defaul兩種配置的t值均爲100。

+0

這是一些深層次的東西.. :-) –

+3

你是如何解決這個問題的?編譯IDEA時遇到確切的問題。我的應用程序中沒有@Order,但它仍然對WebSecurityConfigurerAdapter非常困惑! –

0

你可能得了配置與@order(100)標註在某處你Spring配置。請嘗試刪除@order(100)註釋或提供其他訂單值。

+0

檢查每個java文件的「@Order」,什麼都沒有。是否有可能像XML文件中的「隱式」「@Order」? – Journeycorner

+0

如果你看到堆棧跟蹤,它清楚地提到「WebSecurityConfigurerAdapter」有@order(100) – Imrank

+0

100是默認值,不需要在任何地方提及 – eis

3

通常,當同一個bean被解析兩次時,會發生此異常。 例如,如果@Configuration文件導入解析同一個bean的applicationContext.xml,當應用程序啓動時會嘗試註冊它(在您的情況下是MultiHttpSecurityConfig)兩次,並且出現此錯誤。

我解決了錯誤的XML

0

取出bean定義我有同樣的問題,我解決了這個錯誤移動@Configuration註釋一流水平。

@Configuration 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
0

我的問題得到有效解決,當我加入這個描述的安全配置:

@Configuration("MySecurityConfig") 
public class MySecurityConfig extends WebSecurityConfigurerAdapter 
4

這可能是值得一提,在@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("/"); 
} 

}