较晚的答案,但另一种配置驱动的方法是requires-channel="https"
在各种<sec:intercept-url>
标签上使用 Spring Security with ,并与 Tomcat 结合使用RemoteIpValve
,后者处理先前答案中提到的相同代理标头(x-forwarded-proto
等)。Valve 会根据代理标头更改行为HttpServletRequest.isSecure()
以反映代理报告的协议,而不是连接器实际接收的协议 - 因此,任何依赖于isSecure()
做正确事情的框架(如 Spring)在 SSL 卸载时都会正常运行。
Heroku 中的 SSL 重定向有关于配置 Valve 以与 webapp-runner 和 Heroku 一起使用的说明。
此外,我建议使用PropertyPlaceholderConfigurer
让值可以被环境覆盖。例如,在您的 Spring Security 配置中:
<sec:intercept-url pattern="/api/**" requires-channel="${REQUIRES_CHANNEL}" access="..."/>
相关内容application-config.xml
将包括以下内容:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="properties" ref="applicationProperties"/>
</bean>
<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:/application-config.properties</value>
</list>
</property>
</bean>
该application-config.properties
文件将REQUIRES_CHANNEL=http
默认包含,然后在部署到 Heroku 时,您设置heroku config:set REQUIRES_CHANNEL=https
为覆盖。