`
xyz20003
  • 浏览: 290389 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

(翻译)Spring Security-2.0.x参考文档”信道安全“

阅读更多
信道安全
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)。
分享到:
评论
1 楼 quaff 2008-07-06  
2.0开始内置了一个ANY_CHANNEL,这样ajax的时候就可以避免http和https之间的跨域调用问题.

相关推荐

Global site tag (gtag.js) - Google Analytics