多个@EnableGlobalMethodSecurity注释

时间:2016-05-12 10:57:44

标签: spring-security spring-boot

如果多个配置类具有@EnableGlobalMethodSecurity注释,那么是否使用了一个而忽略了一个?

在Spring启动应用程序中,有两个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{
...

spring-security是否支持使用@EnableGlobalMethodSecurity注释多个配置类?
有没有办法看到实际配置的内容?

1 个答案:

答案 0 :(得分:1)

我调试它(​​进入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();
}