gpt4 book ai didi

java - Spring Security SAML,当使用 SAMLContextProviderLB 设置为 HTTPs 方案时重定向到 HTTP 而不是 HTTPS

转载 作者:搜寻专家 更新时间:2023-10-31 20:00:44 24 4
gpt4 key购买 nike

为 SAMLContextProviderLB bean 附加了我的上下文提供程序

**<property name="scheme" value="https"/>**
<property name="serverName" value="${sp.hostname}"/>
<property name="serverPort" value="#{'${sp.ssl.port}'=='' ? 443 : '${sp.ssl.port}'}"/>
<property name="includeServerPortInRequestURL" value="#{'${sp.ssl.port}'=='443' ? false : true }"/>
<property name="contextPath" value="/${sp.context.root}"/>

我在反向代理后面,所以我正在卸载 SSL 终止。后端服务器本身正在监听非 SSL,但 webtier 正在为我们终止 SSL 并转发到非 SSL 端口。我已经使用上述属性设置了 SAMLContextProviderLB,这样即使后端是 https,它也会知道将 saml token 的预期接收者映射为 https 受众。然而,我在下面的日志中看到的是,当我转到 protected 资源时,它在浏览器上返回垃圾。当我在浏览器中将其更改为 https 时,它会按预期工作。查看下面的日志表明,从 DefaultSavedRequest url 返回的值是 HTTP,而它应该是 HTTPs。

2016-03-07 18:24:11,907 信息 org.springframework.security.saml.log.SAMLDefaultLogger.log:127 - AuthNResponse;SUCCESS;10.4.203.88; https://myserver:89/fct;https://www.myADFS.com/adfs/services/trust;camachof@email.com ;;

2016-03-07 18:24:11,909 DEBUG org.springframework.security.saml.SAMLProcessingFilter.successfulAuthentication:317 - 身份验证成功。更新 SecurityContextHolder 以包含:org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237: Principal: camachof@email.com;凭据:[ protected ];已验证:真实;详细信息:空;未授予任何权限

2016-03-07 18:24:11,910 DEBUG org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess:79 - 重定向到 DefaultSavedRequest 网址:http ://myserver:89/fct/page

2016-03-07 18:24:11,911 DEBUG org.springframework.security.web.DefaultRedirectStrategy.sendRedirect:36 - 重定向到'http://myserver:89/fct/page '

2016-03-07 18:24:11,911 DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository.saveContext:292 - SecurityContext 存储到 HttpSession: 'org.springframework.security.core.context.SecurityContextImpl@830e9237:身份验证:org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237:委托(delegate)人:camachof@email.com;凭据:[ protected ];已验证:真实;详细信息:空;未授予任何权限的

2016-03-07 18:24:11,912 DEBUG org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter:97 - SecurityContextHolder 现在已清除,请求处理已完成

任何想法如何在此设置下将其强制为 HTTPS?提前致谢。

最佳答案

这个问题很老,但如果我找到了其他人,那么我会发布一个答案。

您的负载均衡器或反向代理(Apache httpdnginx)必须为您做一些额外的工作。 Spring(或Spring Boot)和嵌入式Tomcat(或Jetty)认为它们正在运行一个http服务器。它正在做什么。如果代理传递了一些 header 变量,Tomcat 将开始认为它正在运行 https

这是 Apache 需要的示例:

ProxyPreserveHost On
RequestHeader add X-Forwarded-Proto https
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/

ProxyPassProxyPassReverse 是您可能已经拥有的。但是 ProxyPreserveHostX-Forwarded-Proto 确实很重要。

查看 Spring Boot Docs 的这一部分.如果设置了 X-Forwarded-ForX-Forwarded-Proto,您需要将其添加到您的 application.properties 文件中:

server.use-forward-headers=true

和/或

server.forward-headers-strategy=native

取决于您使用的 spring boot 版本。

您还将在该文档中看到您可以为 Tomcat 特定配置添加这些属性:

server.tomcat.remote-ip-header=x-your-remote-ip-header
server.tomcat.protocol-header=x-your-protocol-header

除了以上所有内容外,再执行所有这些操作,它就会开始工作。以上内容本身不足以强制 Tomcat 开始使用 https 转发请求。

我发现因为我的公司有一个基于硬件的负载平衡器(由 Rackspace 管理),所以很难配置它来进行这些更改。所以我们在防火墙/负载平衡器中进行 SSL 终止,然后将请求转发到端口 80 上的 Apache,然后 Apache 将它们转发到端口 8080 上的 Java。是的,这是一团糟。但它让所有这些废话都起作用了。

关于java - Spring Security SAML,当使用 SAMLContextProviderLB 设置为 HTTPs 方案时重定向到 HTTP 而不是 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35856438/

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