如何使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应用程序中发送重定向
- 用于oracle 12c的hibernate方言
- 从java main方法调用servlet
- Ignite for Hibernate L2非常慢
- 如何签署自定义JCE安全提供程序
- 找不到request.getServletContext(),即使使用新的JAR也是如此
- 扫描仪与InputStreamReader
- RestEasy:org.codehaus.jackson.map.JsonMappingException:无法从START_OBJECT标记(..)中反序列化java.util.ArrayList的实例
- 这是相同或不同的pageContext Scope和JSP页面中的一些Implicit对象吗?
- 将Spring @RequestMapping注释自动记录到一个位置?