使用Spring Security进行HTTPS登录会重定向到HTTP

Tho*_*ody 41 ssl https spring spring-security tomcat6

我有一个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"/>
Run Code Online (Sandbox Code Playgroud)

我需要更改什么来使default-target-url和authentication-failure-url转到https?

  • 雄猫6
  • Spring Security 3.0.x.

mar*_*elj 23

您的弹簧配置应与所使用的协议无关.如果使用"需要通道"之类的东西,迟早会遇到问题,特别是如果要将相同的应用程序部署到没有https的开发环境中.

相反,请考虑正确配置您的tomcat.您可以使用RemoteIpValve执行此操作.根据负载均衡器发送的头,您的server.xml配置需要包含以下内容:

<Valve
   className="org.apache.catalina.valves.RemoteIpValve"
   internalProxies=".*"
   protocolHeader="X-Forwarded-Proto"
   httpsServerPort="443"
   />
Run Code Online (Sandbox Code Playgroud)

Spring将根据ServletRequest确定绝对重定向地址,因此如果您使用的是443以外的其他内容,请更改httpsServerPort:

当protocolHeader指示https协议时,httpsServerPort是ServletRequest.getServerPort()返回的端口


Rol*_*015 11

如果它是一个Spring Boot应用程序(我目前使用的是2.0.0版本),则application.properties文件中的以下配置就足够了:

server.tomcat.protocol-header=x-forwarded-proto
Run Code Online (Sandbox Code Playgroud)

这对我在AWS上非常有用,前端有一个负载均衡器。

对于Spring Boot <2.0.0,它也应该工作(未经测试)

  • 谢谢!我还必须添加`server.use-forward-headers = true` https://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-web-servers.html#howto-在代理服务器后面使用tomcat (2认同)

小智 5

我在 Google Kubernetes 背后的 Spring Boot 也遇到了同样的问题。将这两行添加到 application.properties 对我来说是这样的

server.tomcat.remote-ip-header=x-forwarded-for
server.tomcat.protocol-header=x-forwarded-proto
Run Code Online (Sandbox Code Playgroud)

来源:https ://docs.spring.io/spring-boot/docs/current/reference/html/howto-security.html#howto-enable-https


小智 2

我实现此功能的一种方法是添加以下配置

<http auto-config="true" use-expressions="true" entry-point-ref="authenticationEntryPoint" >
    <form-login login-page="/login.jsf" authentication-failure-url="/login.jsf?login_error=t" always-use-default-target="true" default-target-url="xxxxx" />
    <logout logout-url="/logout" logout-success-url="/logoutSuccess.jsf" />
    ...
</http>
Run Code Online (Sandbox Code Playgroud)

必须添加always-use-default-target="true"default-target-url="https://...."。这不是理想的方法,因为您需要在配置中对 url 进行硬编码。