2017-10-22 47 views
2

的某些环境中要求SSL通过2.0.0里程碑版本升级我的Spring Boot应用程序时,我注意到从2.0.0.M4开始security.require-ssl和其他安全配置选项消失了。在current docs中我没有发现任何关于弃用或新方法的提及,因此我挖掘并找到了the GitHub issue where the work originated。我赞同GitHub问题中的目标:如何在使用Spring Boot 2.0.0.M4 +

显着简化2.0中的安全配置。

我很高兴改变我的模式升级,但我有点卡在如何在特定环境中要求SSL。我知道我可以使用http.requiresChannel().anyRequest().requiresSecure()WebSecurityConfigurerAdapter配置中完成类似的结果,但我不想在我运行我的应用程序的每个环境(例如没有证书的前期制作环境,本地主机上的本地开发)中启用此设置。我知道我可以在我的WebSecurityConfigurerAdapter配置中添加一些条件逻辑,但我希望保持我的Spring配置“不受环境影响”,并将我的环境特定配置保存在配置文件特有的属性文件中。

经过对Spring Boot安全配置的最近简化更改后,在某些环境中需要SSL的建议方法是什么?

回答

2

根据您的设置有几个选项。

更改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引导1.x的做法和它对齐不会受到每个请求中附加的if语句的影响。但是,它需要一个财产进行管理。

型材

正如Madhura提到你也可以使用@Profile。如果您在环境之间有很多不同之处,并且对于确定是否需要HTTPS等轻微事情不理想,我发现这种方法更适合。这种方法在进行小改动时遇到的问题是你遇到了很多重复。

2

你完全正确地为自定义安全配置添加自己的WebSecurityConfigurerAdapter。要保持配置环境不可知,您可以添加@Profile,以便根据活动配置文件打开和关闭它。如果只有与环境无关的ssl配置,并且其余安全配置对于所有环境都是相同的,则可以添加WebSecurityConfigurerAdapter,该配置只配置http.requiresChannel().anyRequest().requiresSecure(),其上有@Profile,并命令它为第一个一个踢。

相关问题