如何在某些环境中使用Spring Boot 2.0.0.M4 +来要求SSL

时间:2017-10-22 04:11:23

标签: spring-boot spring-security

在通过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的建议方法是什么?

2 个答案:

答案 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这样的小问题而言,这种方法更适合。进行小改动时这种方法的问题是你遇到了很多重复。