如果多个配置类具有@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注释多个配置类?
有没有办法看到实际配置的内容?
答案 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();
}