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

时间:2014-10-23 11:15:41

标签: java spring spring-security resteasy

我们有一个使用Spring 3.0.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进行响应。所以我尝试在这里实现与描述情况类似的东西:

thread on 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文件中解决,而不是代码。

最诚挚的问候。

3 个答案:

答案 0 :(得分:5)

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标头),例如: documentation for Tomcat
  • 配置您的HTTP反向代理以执行正确的重写,例如请参阅Apache mod_proxy documentation
  • 中的ProxyPassReverse
  • 实现自定义org.springframework.security.web.RedirectStrategy,您将在其中手动设置Location响应标头和HTTP 302状态代码,这应该允许您根据需要发送上下文相对重定向

答案 1 :(得分:1)

并非完全相对,但您可能希望使用org.springframework.web.servlet.view.UrlBasedViewResolver查看第4个选项,使用外部主机名重写重定向的URL,如本答案中所述:Override the default redirect URL in a SpringMVC application

答案 2 :(得分:1)

这应该可以在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

看看这个答案:Sending redirect in Tomcat web application behind a Apache 2 proxy (mod_proxy)