我有一个Spring网络应用程序,使用Spring Security保护,在EC2上运行 . 在EC2实例前面是一个带有SSL证书的Elastic Load Balancer(https终止于负载均衡器,即端口443 - >端口80),因此从Tomcat的角度来看,入站请求是HTTP .
我的登录表单提交到https,但后续重定向转到http(成功或失败) . 身份验证成功,我可以回到https,我已登录 .
我的登录配置如下:
<security:form-login
default-target-url="/home"
login-page="/"
login-processing-url="/processlogin"
authentication-failure-url="/?login_error=1"/>
我需要更改什么来使default-target-url和authentication-failure-url转到https?
-
Tomcat 6
-
Spring Security 3.0.x.
7 回答
您的 spring 配置应与所使用的协议无关 . 如果使用“需要通道”之类的东西,迟早会遇到问题,特别是如果要将相同的应用程序部署到没有https的开发环境中 .
相反,请考虑正确配置您的tomcat . 您可以使用RemoteIpValve执行此操作 . 根据负载均衡器发送的头,您的server.xml配置需要包含以下内容:
Spring将根据ServletRequest确定绝对重定向地址,因此如果您使用的是443以外的其他内容,请更改httpsServerPort:
我得到这个工作的一种方法是添加以下配置
不得不添加
always-use-default-target="true"
和default-target-url="https://...."
. 不是理想的方式,因为您需要在配置中对网址进行硬编码 .如果它是一个Spring Boot应用程序(我目前使用的是2.0.0版本),那么
application.properties
文件中的以下配置就足够了:这适用于AWS,前端有负载均衡器 .
对于Spring Boot <2.0.0,它也应该工作(未测试)
我在所有拦截网址上设置了requires-channel =“any” . 这使它仍然可以在我不使用SSL的开发环境中工作 .
然后,创建一个apache虚拟主机,将所有流量重定向到HTTPS版本 .
我也面临完全相同的问题,直到我得到适当的解决方案,我通过AJP而不是HTTP将我的请求从代理服务器重定向到tomcat服务器 . 下面是我的apache配置
在web.xml中使用下面的代码行
它迫使使用HTTPS .
我在Google Kubernetes背后的Spring Boot遇到了同样的问题 . 将这两行添加到application.properties就可以了
资料来源:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https