Spring Security - 有条件的 WebApplicationInitializer
Posted
技术标签:
【中文标题】Spring Security - 有条件的 WebApplicationInitializer【英文标题】:Spring Security - conditional WebApplicationInitializer 【发布时间】:2016-08-03 02:18:06 【问题描述】:Spring Security 的文档指出,为了使用 Java Config,我们可以扩展 AbstractSecurityWebApplicationInitializer
类,该类将为 Spring Security 设置所有必需的 bean。这种方法工作正常,初始化程序自动运行,并且在应用程序启动期间正确初始化了 Spring Security。
但现在我面临这样一种情况,即这种初始化应该依赖于系统属性。因此,我只想在设置了某些系统属性时才包含我的初始化程序类(例如:app.enablesecurity=true
),并且在任何其他情况下都不执行此初始化程序。
我没有为这种情况想出任何解决方案,因为:
在AbstractSecurityWebApplicationInitializer
onStartup
方法是
标记为 final 所以我不能覆盖它并添加一个条件
如果我只是扩展AbstractSecurityWebApplicationInitializer
它是
总是由 Spring 自动拾取并实例化(或者至少 Spring 尝试创建它的实例,它可能会失败),即使我
将其声明为私有/内部/嵌套类。
据我所知,有条件地包含此初始化程序的唯一可能性是使用 cglib/javassist 以动态创建扩展 AbstractSecurityWebApplicationInitializer
的类。
还有其他方法吗?也许有一些方法可以让我隐藏我的实现不被 Spring 拾取并在以后手动运行它?
【问题讨论】:
【参考方案1】:您可以像这样使用 Config Class 来配置您的安全行为
@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. ...
【讨论】:
以上是关于Spring Security - 有条件的 WebApplicationInitializer的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring-Boot 播种 Spring-Security
如何按条件中断 Spring Security Provider 链?
Grails:有条件地加载 Spring Security LDAP 插件
Spring Security(三十七):Part IV. Web Application Security
如何有条件地跳过 Grails Spring Security 插件过滤器链中的 SecurityContextPersistenceFilter 过滤器