Spring 为测试禁用@EnableGlobalMethodSecurity

Spring 为测试禁用@EnableGlobalMethodSecurity,spring,security,Spring,Security,我读过上一篇关于禁用@EnableGlobalMethodSecurity的解决方案的帖子,但它对我不起作用。基本上,出于测试目的,我需要在启动时启用/禁用@PreAuthorize注释。这是我的相关代码: @Configuration @EnableGlobalMethodSecurity public class OpenAMMethodSecurityConfig extends GlobalMethodSecurityConfiguration { ... @Value("${

我读过上一篇关于禁用@EnableGlobalMethodSecurity的解决方案的帖子,但它对我不起作用。基本上,出于测试目的,我需要在启动时启用/禁用@PreAuthorize注释。这是我的相关代码:

@Configuration
@EnableGlobalMethodSecurity
public class OpenAMMethodSecurityConfig extends GlobalMethodSecurityConfiguration {

...
    @Value("${security.enabled}")
    private boolean enabled;
...

    protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() {
        return enabled ? new SecuredAnnotationSecurityMetadataSource() : null;
    }        
虽然代码将禁用方法安全性,但如果“enabled”标志设置为true,并且除非注释包含…(prespenabled=true),则代码将无法重新启用它。在研究代码时,我认为执行customMethodSecurityMetadataSource()后,Prespenabled会被设置为true


请建议…

您可以使用测试属性根据您拥有的内容禁用设置

@TestPropertySource(properties = "security.enabled:false")

您可以创建一个测试配置,该配置将覆盖
MethodSecurityMetadataSource
,并有效防止调用安全方法。这将允许您仅在应用程序的测试部分保留逻辑,而不会用测试逻辑污染主代码。稍后,您只需将
@ActiveProfiles(“安全指示灯”)
放在相应的spring引导测试上

@Configuration
@Profile("security-light")
public class SecurityLightConfiguration {

    @Bean
    @Primary
    MethodSecurityMetadataSource doTheMagic() {
        return new DelegatingMethodSecurityMetadataSource(Collections.emptyList());
    }
}