[英]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 进行响应。 所以我尝试在这里实现与描述情况类似的东西:
我已经使用 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,无论配置或上下文设置如何。
您有多种选择:
AJP
代替 HTTP 反向代理,或使用某些应用程序服务器支持的公共 URL 传递 HTTP 标头),例如Tomcat 的文档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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.