单点登出需要配置
<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干掉了,单点登出功能就失效了。