2016-05-12 101 views
1

如果多個配置類具有@EnableGlobalMethodSecurity註釋,那麼是否使用了一個註釋?多個@EnableGlobalMethodSecurity註釋

在彈簧啓動應用程序中,有兩個WebSecurityConfigurerAdapter的實例 - 一個註釋爲@EnableGlobalMethodSecurity(secured = true),另一個爲@EnableGlobalMethodSecurity(prePostEnabled = true)。但到目前爲止,我無法使@PreAuthorize註釋生效。只有一個註釋可以看到它正在被應用。 如

@Configuration 
@Order(Ordered.HIGHEST_PRECEDENCE) 
@EnableGlobalMethodSecurity(prePostEnabled=true) 
public class FirstConfigurer extends WebSecurityConfigurerAdapter { 
... 

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(securedEnabled = true) 
public class AnotherConfiguration extends WebSecurityConfigurerAdapter{ 
... 

是否彈簧安全支持多種配置類是與@EnableGlobalMethodSecurity註解?
有沒有辦法查看實際配置的內容?

回答

0

我調試它(​​進入springframework源),看看它正在加載和以什麼順序。

我有一個類似的情況,我有一個庫(我無法更改),配置@EnableGlobalMethodSecurity(securedEnabled = true)

,我想用@EnableGlobalMethodSecurity(prePostEnabled=true)

發生了什麼這是該庫的配置被加載在我的配置(只有最後一個被載入將被使用)

我試圖用@Order(Ordered.LOWEST_PRECEDENCE)@EnableGlobalMethodSecurity(order = Ordered.HIGHEST_PRECEDENCE, ...但沒有效果。

我的解決辦法是通過我的配置是這樣導入庫配置設置的順序,我想:

@Import(LibraryConfig.class) 
@EnableGlobalMethodSecurity(prePostEnabled=true) 
public class MyConfiguration extends GlobalMethodSecurityConfiguration { 
    /* my code */ 
} 

PLUS:我發現我的情況更復雜,因爲圖書館是我使用配置@EnableGlobalMethodSecurity(securedEnabled = true)不止一次。 因此,行爲有點不同,爲了強制使用我的配置,我不得不重寫此方法的實現:

@Bean 
public MethodSecurityMetadataSource methodSecurityMetadataSource() { 
    return super.methodSecurityMetadataSource(); 
} 

@Bean 
public MethodInterceptor methodSecurityInterceptor() throws Exception { 
    return super.methodSecurityInterceptor(); 
} 

@Bean 
public PreInvocationAuthorizationAdvice preInvocationAuthorizationAdvice() { 
    return super.preInvocationAuthorizationAdvice(); 
}