繁体   English   中英

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

[英]How to make Spring Security application to run behind a proxy?

我们有一个基于 Java 1.6 和 Spring 3.0.3 构建的应用程序,它使用 Spring Security 3.0.5 并使用 Spring Web 和 RestEasy 2.1.0 实现 REST API。 我需要将此应用程序(服务器)置于代理之后,该代理将来自 REST API 客户端应用程序的 HTTPS 请求流量转换为 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。

这意味着默认情况下您将始终获得绝对 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使用外部主机名重写重定向的 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 代理后面的 Tomcat Web 应用程序中发送重定向 (mod_proxy)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM