在通过2.0.0里程碑版本升级我的Spring Boot应用程序时,我注意到从2.0.0.M4 security.require-ssl
开始,其他安全配置选项已经消失。我没有在current docs中找到任何关于弃用或新方法的提及,因此我挖掘并发现了the GitHub issue where the work originated。我赞同GitHub问题中的目标:
显着简化了2.0中的安全配置。
我很高兴改变我的模式进行升级,但我对如何在特定环境中要求SSL感到困惑。我知道我可以使用WebSecurityConfigurerAdapter
在我的http.requiresChannel().anyRequest().requiresSecure()
配置中完成类似的结果,但我不想在我运行应用程序的每个环境中启用此设置(例如,没有证书的预生产环境, localhost上的本地开发)。我知道我可以在WebSecurityConfigurerAdapter
配置中添加一些条件逻辑,但我喜欢将我的Spring配置保持为“环境不可知”,并将特定于环境的配置保存在特定于配置文件的属性文件中。
在对Spring Boot的安全配置进行这些最近的简化更改之后,在某些环境中需要SSL的建议方法是什么?
答案 0 :(得分:3)
关于添加自己的WebSecurityConfigurerAdapter
以自定义安全配置,您是完全正确的。要使该配置环境不可用,您可以添加@Profile
,以便可以根据活动配置文件打开和关闭它。如果只有环境无关的ssl配置,并且所有环境的其他安全配置都相同,则可以添加仅WebSecurityConfigurerAdapter
http.requiresChannel().anyRequest().requiresSecure()
,其@Profile
具有{{1}}在它上面并命令它,这是第一个开始的。
答案 1 :(得分:3)
根据您的设置,有几个选项。
更改RequestMatcher
如果您需要HTTPS的唯一时间是在具有代理注入的自定义标头的环境中(即X-Forwarded- *标头),您可以执行以下操作:
http
.requiresChannel()
.requestMatchers( r -> r.getHeader("X-Forwarded-Proto") != null).requiresSecure()
.and()
// ...
这种方法的好处是你不需要做任何事情来打开或关闭HTTPS。缺点是比较标题的性能非常低。这种性能打击应该可以忽略不计,但对某些人来说可能并不美观。
条件配置
由于这是Java代码,因此您始终可以使用布尔标志来确定是否需要HTTPS。例如,创建一个成员变量并将其解析为Externalized Configuration,如下所示:
@Value("${security.require_ssl}")
private boolean requireHttps;
然后使用这样的东西:
if(this.requireHttps) {
http
.requiresChannel()
.anyRequest().requiresSecure();
}
http
// ...
这种方法很好地与Spring Boot 1.x方法很好地对齐,并且它不会受到每个请求中额外的if语句的影响。但是,它需要管理一个属性。
<强>配置文件强>
如Madhura所述,您也可以使用@Profile
。我发现如果您在环境之间存在很多差异,并且对于确定是否需要HTTPS这样的小问题而言,这种方法更适合。进行小改动时这种方法的问题是你遇到了很多重复。