- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
为 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 httpd
或 nginx
)必须为您做一些额外的工作。 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/
ProxyPass
和 ProxyPassReverse
是您可能已经拥有的。但是 ProxyPreserveHost
和 X-Forwarded-Proto
确实很重要。
查看 Spring Boot Docs 的这一部分.如果设置了 X-Forwarded-For
或 X-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/
为 SAMLContextProviderLB bean 附加了我的上下文提供程序 **** 我在反向代理后面,所以我正在卸载
我是一名优秀的程序员,十分优秀!