9.3.2 强制通道的安全性

使用 HTTP 提交数据是一件具有风险的事情。如果使用 HTTP 发送无关紧要的信息,这可能不是什么大问题。但是如果你通过 HTTP 发送诸如密码和信用卡号这样的敏感信息的话,那你就是在找麻烦了。通过 HTTP 发送的数据没有经过加密,黑客就有机会拦截请求并且能够看到他们想看的数据。这就是为什么敏感信息要通过 HTTPS 来加密发送的原因。

使用 HTTPS 似乎很简单。你要做的事情只是在 URL 中的 HTTP 后加上一个字母 ”s” 就可以了。是这样吗?

这是真的,但这是把使用 HTTPS 通道的责任放在了错误的地方。通过添加 “s” 我们就能很容易地实现页面的安全性,但是忘记添加 “s” 同样也是很容易出现的。如果我们的应用中有多个链接需要 HTTPS,估计在其中的一两个上忘记添加 “s” 的概率还是很高的。

另一方面,你可能还会在原本并不需要 HTTPS 的地方,误用 HTTPS。

传递到 configure() 方法中的 HttpSecurity 对象,除了具有 authorizeRequests() 方法以外,还有一个 requiresChannel() 方法,借助这个方法能够为各种 URL 模式声明所要求的通道。

作为示例,可以参考 Spittr 应用的注册表单。尽管 Spittr 应用不需要信用卡号、社会保障号或其他特别敏感的信息,但用户有可能仍然希望信息是私密的。为了保证注册表单的数据通过 HTTPS 传送,我们可以 在配置中添加requiresChannel() 方法,如下所示:

程序清单 9.5 requiresChannel() 方法会为选定的 URL 强制使用 HTTPS

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .authorizeRequests()
    .antMatchers("/spitter/me").hasRole("SPITTER")
    .antMatchers(HttpMethod.POST, "/spittles").hasRole("SPITTER")
    .anyRequest().permitAll()
    .and()
    .requeresChannel()
    .antMatchers("/spitter/form").requiresSecure();
}

不论何时,只要是对 /spitter/form 的请求,Spring Security 都视为需要安全通道(通过调用 requiresChannel() 确定的)并自动将请求重定向到 HTTPS 上。

与之相反,有些页面并不需要通过 HTTPS 传送。例如,首页不包含任何敏感信息,因此并不需要通过 HTTPS 传送。我们可以使用 requiresInsecure() 代替 requiresSecure() 方法,将首页声明为始终通过 HTTP 传送:

.antMatchers("/").requiresInecure();

如果通过 HTTPS 发送了对 “/” 的请求,Spring Security 将会把请求重定向到不安全的 HTTP 通道上。

在强制要求通道时,路径的选取方案与 authorizeRequests() 是相同的。在程序清单 9.5 中,使用了 antMatches(),但我们也可以使用 regexMatchers() 方法,通过正则表达式选取路径模式。

Last updated