Leo*_*ell 4 spring-security spring-boot
在通过 2.0.0 里程碑版本升级我的 Spring Boot 应用程序时,我注意到从 2.0.0.M4 开始security.require-ssl和其他安全配置选项都消失了。我在当前文档中没有发现任何关于弃用或新方法的提及,所以我四处寻找并找到了工作起源的 GitHub 问题。我为 GitHub 问题中的目标鼓掌:
显着简化了 2.0 中的安全配置。
并且很高兴更改我的模式以进行升级,但我对如何在特定环境中要求 SSL 有点卡住了。我知道我可以在我的WebSecurityConfigurerAdapter配置中使用实现类似的结果,http.requiresChannel().anyRequest().requiresSecure()但我不想在我运行我的应用程序的每个环境中启用这个设置(例如,没有证书的预生产环境,本地开发)。我知道我可以在我的WebSecurityConfigurerAdapter配置中放置一些条件逻辑,但我喜欢保持我的 Spring 配置“环境不可知”,并将我的环境特定配置保存在特定于配置文件的属性文件中。
在最近对 Spring Boot 的安全配置进行了这些简化更改之后,在某些环境中需要 SSL 的推荐方法是什么?
根据您的设置,有几个选项。
更改 RequestMatcher
如果您需要 HTTPS 的唯一时间是在具有代理注入的自定义标头(即 X-Forwarded-* 标头)的环境中,您可以执行以下操作:
http
    .requiresChannel()
        .requestMatchers( r -> r.getHeader("X-Forwarded-Proto") != null).requiresSecure()
        .and()
    // ...
这种方法的好处是您无需执行任何操作即可打开或关闭 HTTPS。缺点是比较标题的性能影响非常小。这种性能影响应该可以忽略不计,但对某些人来说可能不美观。
条件配置
由于这是 Java 代码,因此您始终可以使用布尔标志来确定是否需要 HTTPS。例如,创建一个成员变量并将其解析为外部化配置,如下所示:
@Value("${security.require_ssl}")
private boolean requireHttps;
然后使用这样的东西:
if(this.requireHttps) {
    http
        .requiresChannel()
            .anyRequest().requiresSecure();
}
http
    // ...
这种方法与 Spring Boot 1.x 方法非常吻合,并且不会受到每个请求中额外的 if 语句的影响。但是,它需要管理一个属性。
简介
正如 Madhura 提到的,您也可以使用@Profile. 如果环境之间存在很多差异,我发现这种方法更适合,而不适合确定是否需要 HTTPS 等小事。在进行小的更改时,这种方法的问题是您会遇到很多重复。
| 归档时间: | 
 | 
| 查看次数: | 6491 次 | 
| 最近记录: |