如何使Spring Security应用程序在代理后面运行?

我们有一个基于Spring 1.6.3的Java 1.6上的应用程序,它使用Spring Security 3.0.5并使用Spring Web和RestEasy 2.1.0实现REST API。 我需要将此应用程序(服务器)置于代理之后,该代理将HTTPS请求流量从REST API客户端应用程序转换为HTTP流量。 此更改为登录请求创建“跨域”方案:客户端发送HTTPS登录请求,服务器使用HTTP的重定向URL进行应答。 目前它回复:

”http://192.168.0.10:8090/index.html;jsessionid=64FD79...86D”

我需要的是:

”/index.html;jsessionid=64FD79...86D”

我们提供了解决方案,使服务器响应“相对”URL而不是“绝对”URL。 所以我尝试在这里实现与描述情况类似的东西:

forum.spring.io上的主题

我已经使用contextRelative =“true”设置RedirectStrategy bean并从LoginSuccessHandler扩展类中的AbstractAuthenticationTargetUrlRequestHandler覆盖redirectStrategy setter,我看到HttpServletResponse对象的redirectStrategy属性按预期设置为true。 仍然没有解决问题。

此外,当使用encodeRedirectURL(“otherLogin”)更改HttpServletResponse对象的redirectURLCC属性时,设置类似于

”http://192.168.0.10:8090/otherLogin”

而这不是我需要的。 我需要删除URL的整个协议+ ipaddress部分。 响应对象的URL属性无法进行更改,因为它由Filter和FilterChain接口实现包装。

请提出任何想法。 我想这种事情应该在web.xml或auth-AplicationContext.xml文件中解决,而不是在代码中。

最好的祝福。

Spring Security在发送重定向时使用以下逻辑:

 public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException { String redirectUrl = calculateRedirectUrl(request.getContextPath(), url); redirectUrl = response.encodeRedirectURL(redirectUrl); if (logger.isDebugEnabled()) { logger.debug("Redirecting to '" + redirectUrl + "'"); } response.sendRedirect(redirectUrl); } 

sendRedirect方法需要以下列方式运行:

此方法可以接受相对URL; 在将响应发送到客户端之前,servlet容器必须将相对URL转换为绝对URL。

这意味着无论配置或上下文设置如何,您都将通过deafult始终获得绝对URL。

您有多种选择:

  • 配置您的容器或应用程序服务器以了解公共URL(例如,通过使用AJP而不是HTTP反向代理,或使用某些应用程序服务器支持的公共URL传递HTTP标头),例如Tomcat的文档
  • 配置HTTP反向代理以执行正确的重写,例如,请参阅Apache mod_proxy文档中的 ProxyPassReverse
  • 实现自定义org.springframework.security.web.RedirectStrategy ,您将在其中手动设置Location响应头和HTTP 302状态代码,这应该允许您根据需要发送上下文相对重定向

并非完全相对,但您可能希望使用org.springframework.web.servlet.view.UrlBasedViewResolver查看第4个选项,使用您的外部主机名重写重定向的URL,如本答案中所述: 覆盖默认重定向URL在SpringMVC应用程序中 。

这应该可以在Apache上实现:

 ProxyPreserveHost Off ProxyPass / http://192.168.0.10:8090 ProxyPassReverse / http://192.168.0.10:8090 

并在端口上的代理主机上再添加一个代理反向。 例如,假设您的服务器名称是proxy.example.com,第四行将是:

 ProxyPassReverse / http://proxy.exemple.com:8090 

看看这个答案: 在Apache 2代理(mod_proxy)后面的Tomcat Web应用程序中发送重定向