信道安全
7.1. 总述
为了在你的程序中协调认证与验证的要求,Spring Security也可以让未认证的web请求携带一些属性。 这些属性可能包括特定的传输类型,拥有特定的 HttpSession 属性设置,或其他。 最常见的需求是,让你的web请求使用特定的传输协议发送,比如HTTPS。
威胁传输安全的一个重要因素是会话劫持。你的web容器通过用户代理发送cookie或URL重写,使用jsessionid,来管理HttpSession。 如果jsessionid使用HTTP发送,会话标识符很可能在用户通过验证过后,被其他人拦截,再去模拟用户访问。 这是因为大多数web容器,为给定的用户维护相同的session标识符,即使他们从HTTP转换到HTTPS页面也不会改变。
如果会话劫持在你的特定程序里被认为是一个特别值得关注的威胁,唯一的解决方式就是在每个请求里都使用HTTPS。 这意味着jsessionid再也不会通过不安全的通道。 你会需要确认你的web.xml定义的<welcome-file>指向HTTPS位置。 Spring Security在后面提供一个方法来帮助实现这些功能。
7.2. 配置
信道安全已在安全命名空间获得支持, 使用<intercept-url>元素里的requires-channel属性,就能很简单实现(也推荐这样做)。
为了明确配置信道安全你需要在你的application context中定义下面的过滤器:
<bean id="channelProcessingFilter" class="org.springframework.security.securechannel.ChannelProcessingFilter">
<property name="channelDecisionManager" ref="channelDecisionManager"/>
<property name="filterInvocationDefinitionSource">
<security:filter-invocation-definition-source path-type="regex">
<security:intercept-url pattern="\A/secure/.*\Z" access="REQUIRES_SECURE_CHANNEL"/>
<security:intercept-url pattern="\A/acegilogin.jsp.*\" access="REQUIRES_SECURE_CHANNEL"/>
<security:intercept-url pattern="\A/j_spring_security_check.*\Z" access="REQUIRES_SECURE_CHANNEL"/>
<security:intercept-url pattern="\A/.*\Z" access="REQUIRES_INSECURE_CHANNEL"/>
</security:filter-invocation-definition-source>
</property>
</bean>
<bean id="channelDecisionManager" class="org.springframework.security.securechannel.ChannelDecisionManagerImpl">
<property name="channelProcessors">
<list>
<ref bean="secureChannelProcessor"/>
<ref bean="insecureChannelProcessor"/>
</list>
</property>
</bean>
<bean id="secureChannelProcessor" class="org.springframework.security.securechannel.SecureChannelProcessor"/>
<bean id="insecureChannelProcessor" class="org.springframework.security.securechannel.InsecureChannelProcessor"/>
和 FilterSecurityInterceptor 一样,ChannelProcessingFilter也支持Apache Ant样式的路径。
这个 ChannelProcessingFilter 操作,通过过滤所有的web请求,决定应用配置属性。 它将代理ChannelDecisionManager。 默认实现ChannelDecisionManagerImpl,应该涵盖了大多数情况。 它简单使用配置的ChannelProcessor实例。 一个ChannelProcessor会重新检查请求,如果请求不符合(比如,它发送数据使用了错误的传输协议),就会执行一个重定向,抛出一个异常,或执行需要的任何一个操作。
Spring Security里包含两个具体ChannelProcessor实现: SecureChannelProcessor 确保对应配置REQUIRES_SECURE_CHANNEL属性的请求使用HTTPS发送数据。 InsecureChannelProcessor 确保对应配置REQUIRES_INSECURE_CHANNEL属性的请求使用HTTP发送数据。 如果没有使用对应的传输协议,这两个实现都代理ChannelEntryPoint。 包含在Spring Security里的这两个ChannelEntryPoint实现,只是把请求简单重定向到合适的HTTP或HTTPS。 合适的默认分配给ChannelProcessor实现,为它们相应的配置属性关键字和它们代表的ChannelProcessor,不过,你可以使用application context重写它们。
注意,重定向使用的是绝对地址(比如http://www.company.com:8080/app/page),不是相对地址(比如/app/page)。 在测试过程中,发现了IE6 sp1的一个bug,在重定向时,如果只改变了端口,它就不能响应成功。 因此,绝对URL就是用来在PortResolverImpl中,解决这个bug检测逻辑,这是默认情况下被Spring Security bean使用的。 请参考PortResolverImpl的JavaDocs获得更多信息。
你应该注意,在登录过程中,推荐使用信道安全,保持用户名和密码的安全。 如果你没有决定在基于表单的登录里使用ChannelProcessingFilter。 请确认你的登录页,设置了REQUIRES_SECURE_CHANNEL,并让AuthenticationProcessingFilterEntryPoint.forceHttps的值是true。
7.3. 总结
一旦配置好,使用信道安全过滤器就非常简单了。 简单请求页面,不限制协议(比如HTTP或HTTPS)或端口(比如80,8080,443,8443等等)。 很明显,我们还需要配置初始请求(可能通过web.xml的<welcome-file>或一个众所周知的主页URL),但是一旦这个发生了,过滤器就会按照你的application context定义的那样执行重定向。
你也可以添加自己的ChannelProcessor实现ChannelDecisionManagerImpl。 比如,你可能在使用“输入图片中的内容”检测真人用户的过程中,要设置一个HttpSession属性。 你的ChannelProcessor会响应REQUIRES_HUMAN_USER配置属性,然后重定向到合适的入口点,如果HttpSession属性还没有设置,启动真人用户的验证过程。
为了决定是否进行一个安全检测,依靠ChannelProcessor或AccessDecisionVoter,前一个被设计成处理未认证的请求,而后一个被设计成处理已认证的请求。 因此,后一个可以访问验证主体的被授权权限。 另外,ChannelProcessor检测到问题,就会进行HTTP/HTTPS的重定向,来满足它的需求。 AccessDecisionVoter检测到一个问题,会导致一个AccessDeniedException(取决于AccessDecisionManager)。
分享到:
相关推荐
包含翻译后的API文档:spring-security-core-5.3.9.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-core:5.3.9.RELEASE; 标签:springframework、security...
spring-beans-2.0.xsd
包含翻译后的API文档:spring-security-core-5.2.0.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-core:5.2.0.RELEASE; 标签:springframework、security...
包含翻译后的API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security.oauth:spring-security-oauth2:2.3.5.RELEASE; 标签:spring、security...
包含翻译后的API文档:spring-security-rsa-1.0.10.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-rsa:1.0.10.RELEASE; 标签:spring、rsa、security、...
包含翻译后的API文档:spring-security-jwt-1.0.10.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-jwt:1.0.10.RELEASE; 标签:spring、security、jwt、...
包含翻译后的API文档:spring-security-web-5.2.0.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-web:5.2.0.RELEASE; 标签:springframework、security、...
spring-boot-starter-web-2.0.7.0.jar
spring-dwr-2.0.xsd spring 与 DWR进行配置
包含翻译后的API文档:spring-boot-actuator-autoconfigure-2.3.12.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.boot:spring-boot-actuator-autoconfigure:2.3.12....
Struts2-Spring-Plugin-2.0.11.1版本是在2.0.11.1时期发布的,可能包含了一些特定的修复和优化,具体可以查阅该版本的发行说明或官方文档,以了解其特性、改进和已知问题。 在使用这个插件时,你需要在Struts2的...
包含翻译后的API文档:spring-security-oauth2-2.3.5.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.security.oauth:spring-security-oauth2:2.3.5.RELEASE; 标签:spring...
包含翻译后的API文档:spring-security-core-5.0.7.RELEASE-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-core:5.0.7.RELEASE; 标签:springframework、security...
spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-2.5.2.jar spring-aop-2.5.4.jar spring-aop-2.5.5.jar spring-aop-2.5.6.jar spring-aop-3.0.0.RELEASE.jar spring-aop-3.0.2.RELEASE.jar spring-aop-sources...
包含翻译后的API文档:spring-security-crypto-5.6.1-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-crypto:5.6.1; 标签:spring、security、springframework、...
在这个场景中,`commons-fileupload-1.2.1.jar` 和 `commons-io-2.0.jar` 是两个至关重要的库,它们为Spring提供了强大的文件上传支持。 `commons-fileupload-1.2.1.jar` 是Apache Commons FileUpload项目的组件,...
包含翻译后的API文档:spring-security-jwt-1.0.10.RELEASE-javadoc-API文档-中文(简体)-英语-对照版.zip; Maven坐标:org.springframework.security:spring-security-jwt:1.0.10.RELEASE; 标签:spring、security...
首先,`struts-2.0.dtd`是Struts 2.0的文档类型定义,它是XML文件的一种规范,用于验证`struts.xml`配置文件的语法是否正确。DTD中定义了配置元素和属性,如action、result、package等,确保开发者在编写配置文件时...
包含翻译后的API文档:spring-security-crypto-5.5.2-javadoc-API文档-中文(简体)版.zip; Maven坐标:org.springframework.security:spring-security-crypto:5.5.2; 标签:springframework、security、spring、...