Spring安全性-条件WebApplicationInitializer

Spring安全性-条件WebApplicationInitializer,spring,security,tomcat,Spring,Security,Tomcat,Spring Security的文档说明,为了使用Java配置,我们可以扩展AbstractSecurityWebApplicationInitializer类,该类将为Spring Security设置所有Nesarry bean。这种方法工作正常,初始化器自动运行,Spring Security在应用程序启动期间正确初始化 但是现在我面临一个场景,这个初始化应该依赖于一个系统属性。因此,我希望仅在设置了某些系统属性(例如:app.enablesecurity=true)时才包含我的初始值设定

Spring Security的文档说明,为了使用Java配置,我们可以扩展
AbstractSecurityWebApplicationInitializer
类,该类将为Spring Security设置所有Nesarry bean。这种方法工作正常,初始化器自动运行,Spring Security在应用程序启动期间正确初始化

但是现在我面临一个场景,这个初始化应该依赖于一个系统属性。因此,我希望仅在设置了某些系统属性(例如:
app.enablesecurity=true
)时才包含我的初始值设定项类,并且在任何其他情况下都不执行此初始值设定项

我未能针对该场景提出任何解决方案,因为:

  • AbstractSecurityWebApplicationInitializer
    中,启动
    onStartup
    方法是 已标记为final,因此我无法覆盖它并添加条件
  • 如果我只是扩展AbstractSecurityWebApplicationInitializer,它就是 始终由Spring自动拾取并实例化(或者至少Spring尝试创建它的实例,它可能会失败),即使我 将其声明为私有/内部/嵌套类
据我所知,有条件地包含此初始值设定项的唯一可能性是使用cglib/javassist动态创建一个扩展
AbstractSecurityWebApplicationInitializer
的类


还有别的办法吗?也许有某种方法可以让我隐藏我的实现,不让Spring获取,并在以后手动运行它?

您可以使用类似这样的配置类来配置您的安全行为

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${app.enablesecurity}")
    private boolean securityEnabled;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        if (securityEnabled) {
            http.csrf().disable();
            ...
        } else {
            http. ...  
        }
    }
}