附加了我的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令牌的预期接收方映射为https受众。然而,当我转到受保护的资源时,我在下面的日志中看到的是它在浏览器上返回的垃圾。当我在浏览器中将其更改为https时,它按预期工作。查看下面的日志显示,从DefaultSavedRequest url 返回的值应该是HTTPs.。
2016-03-07 18:24:11,907 INFO 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调试org.springframework.security.saml.SAMLProcessingFilter.successfulAuthentication:317 -身份验证成功。更新包含: org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237:主体: camachof@email.com;凭据:受保护;验证:真;详细信息: null;未授予任何授权
2016-03-07 18:24:11,910调试org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler.onAuthenticationSuccess:79 -重定向到DefaultSavedRequest Url:http://myserver:89/fct/page
2016-03-07 18:24:11:11调试org.springframework.security.web.DefaultRedirectStrategy.sendRedirect:36 -重定向到“http://myserver:89/fct/page”
2016-03-07 18:24:11,911调试org.springframework.security.web.context.HttpSessionSecurityContextRepository.saveContext:292 - SecurityContext存储到HttpSession:'org.springframework.security.core.context.SecurityContextImpl@830e9237:身份验证: org.springframework.security.providers.ExpiringUsernameAuthenticationToken@830e9237:主体: camachof@email.com;凭据:受保护;身份验证:真;详细信息: null;未授予任何权限‘
2016-03-07 18:24:11,912调试org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter:97 - SecurityContextHolder已清除,请求处理已完成
有什么想法,如何强迫这个HTTPS在这个设置下?提前谢谢。
发布于 2016-11-30 02:46:53
这个问题是旧的,但如果我发现了,别人可能会,所以我会张贴一个答案。
您的负载均衡器或反向代理(Apache httpd或nginx)必须为您做一些额外的工作。Spring (或Spring Boot)和嵌入式Tomcat (或Jetty)认为它们在运行http服务器。这是它在做的。如果代理传递一些头变量,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/ProxyPass和ProxyPassReverse是您可能已经拥有的。但是ProxyPreserveHost和X-Forwarded-Proto真的很重要。
请查看弹簧启动文件的这一部分。如果设置了X-Forwarded-For或X-Forwarded-Proto,则需要将其添加到application.properties文件中:
server.use-forward-headers=true和/或
server.forward-headers-strategy=native取决于您使用的spring引导的哪个版本。
您还将在该文档中看到,您可以为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。是的,真是一团糟。但这些废话都起作用了。
https://stackoverflow.com/questions/35856438
复制相似问题