SessionFixationProtectionStrategy导致CAS单点登出失效的问题

单点登出需要配置

 <listener>  
        <listener-class>  
            org.jasig.cas.client.session.SingleSignOutHttpSessionListener  
        </listener-class>  
 </listener>

 当session失效的时候会清除掉cas-client中缓存的session信息。这个map缓存了st和session的关系。当单点登出时,cas系统会发送saml协议的xml到各service上,通知各系统退出。这个动作是依靠st去找对应的session的。上面这个listener,负责在本机的session失效的时候去清除掉session缓存,避免OOM。

Spring Security Concurrency Control需要配置

<listener>
  <listener-class>
    org.springframework.security.web.session.HttpSessionEventPublisher
  </listener-class>
</listener>
 <beans:bean id="sas"
        class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy">
        <beans:constructor-arg>
            <beans:list>
                <beans:bean
                    class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy">
                    <beans:constructor-arg ref="sessionRegistry" />
                    <beans:property name="maximumSessions" value="1" />
                </beans:bean>
                <beans:bean
                    class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy">
                </beans:bean>
                <beans:bean
                    class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy">
                    <beans:constructor-arg ref="sessionRegistry" />
                </beans:bean>
            </beans:list>
        </beans:constructor-arg>
    </beans:bean>

 SessionFixationProtectionStrategy中在授权的时候做了session.invalid()的动作,然后重新从request中新建了一个session,然后把旧的session中的内容全部复制到新的里面。这里有个参数控制是否要重建session,但是如果需要并发控制,此参数必须为true。在重建的这个过程中触发了单点登出的session监听器的destroy方法,将缓存中的session干掉了,单点登出功能就失效了。

猜你喜欢

转载自frankawp.iteye.com/blog/2407534