使用 Spring Security 配置 HTTP 页面和 HTTPS 页面
Posted
技术标签:
【中文标题】使用 Spring Security 配置 HTTP 页面和 HTTPS 页面【英文标题】:Configuring HTTP pages and HTTPS pages with Spring Security 【发布时间】:2015-04-10 20:58:23 【问题描述】:我已经使用 Spring Security 成功设置了一个应用程序。当用户请求安全页面时,Spring 会自动将这些用户重定向到 HTTPS 页面。
<http auto-config="true" use-expressions="true" once-per-request="true" >
<intercept-url pattern="/login" access="permitAll" requires-channel="https"/>
<intercept-url pattern="/my-account" access="isAuthenticated()" requires-channel="https"/>
<logout />
<form-login login-page="/login" />
<port-mappings>
<port-mapping http="8080" https="8443"/>
<port-mapping http="80" https="443"/>
</port-mappings>
</http>
但是当用户导航时,接下来的其他没有敏感信息的页面仍然使用 HTTPS。我想只使用 HTTP 访问这些普通页面。
有什么聪明的方法可以做到这一点吗?我希望仅使用 HTTP 访问我未配置为 HTTPS 通道的所有其他页面。我尝试使用一些通配符但没有成功。
额外细节: HTTPS 使用更多的服务器 CPU。我在某些页面上有很多请求,我想避免这笔额外费用。
【问题讨论】:
为什么不对整个站点使用 HTTPS?见火羊 我读到它使用了更多的服务器 CPU。我在某些页面上有很多请求,我想避免这笔额外费用。 【参考方案1】:将您的整个网站设为 HTTPS。这些天来,性能变化很小,您不会通过通过 HTTP 公开他们的会话 cookie 来欺骗您的用户。
https://istlsfastyet.com/
【讨论】:
【参考方案2】:在 Spring-Security 中,你可以这样做 -
<http auto-config="true" use-expressions="true" once-per-request="true" >
<intercept-url pattern="/login" access="permitAll" requires-channel="https"/>
<intercept-url pattern="/my-account" access="isAuthenticated()" requires-channel="https"/>
<intercept-url pattern="/**" access="permitAll" requires-channel="http"/>
除了“/login”和“/my-account”之外的所有其他url都将通过http提供。
除此之外,您必须为 cookie 设置安全标志。 通过设置安全标志,浏览器将阻止通过未加密通道传输 cookie。 https://www.owasp.org/index.php/SecureFlag
【讨论】:
最后一行没有覆盖所有其他配置? 最后一行没有覆盖之前的intercept-url配置。 Spring Security 从上到下进行拦截 url 模式匹配,对于找到的第一个匹配,它应用配置的“requires-channel”。所以对于上面的行,所有的 url 模式(除了“/login”和“/my-account”),通道都是 HTTP。以上是关于使用 Spring Security 配置 HTTP 页面和 HTTPS 页面的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring Security 仅接受 https 流量并拒绝所有 http 流量?
Spring Security 3.2 CSRF 禁用特定 URL
Spring Security - 更改 RedirectStrategy 的所有实例
如何在我的 Spring 4.0 RestFul Web 服务上实现 Spring Security?