gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:22:45 25 4
gpt4 key购买 nike

我们有一个基于 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 的解决方案。所以我尝试实现与此处描述的情况类似的东西:

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 的整个协议(protocol)+ipaddress 部分。响应对象的 URL 属性不可更改,因为它被 Filter 和 FilterChain 接口(interface)实现包装。

请提出任何想法。我想这种事情应该在 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 方法需要按以下方式运行:

This method can accept relative URLs; the servlet container must convert the relative URL to an absolute URL before sending the response to the client.

这意味着无论配置或上下文设置如何,默认情况下您始终会获得绝对 URL。

您有多种选择:

  • 配置您的容器或应用服务器以识别公共(public) URL(例如,使用 AJP 代替 HTTP 反向代理,或使用某些应用服务器支持的公共(public) URL 传递 HTTP header ), 例如documentation for Tomcat
  • 配置您的 HTTP 反向代理以执行正确的重写,例如请参阅 Apache mod_proxy documentation 中的 ProxyPassReverse
  • 实现自定义 org.springframework.security.web.RedirectStrategy,您将在其中手动设置 Location 响应 header 和 HTTP 302 状态代码,这应该允许您发送根据需要进行上下文相关重定向

关于java - 如何使 Spring Security 应用程序在代理后面运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26526830/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com