我有一个使用spring security和CAS(spring 3.0.5,cas 3.4.5)的应用程序,但是当我登录会话时,id不会改变。
当我登录CasAuthenticationFilter
执行身份验证并且身份验证成功时,它不会继续过滤器链,而是在SecurityContextHolder
上设置身份验证并调用successHandler。这会重定向到我请求的原始URL,该URL需要进行身份验证。 SessionManagementFilter
永远不会破解调用会话策略来创建新会话。
AbstractAuthenticationFilter
扩展的CasAuthenticationFilter
似乎有自己的会话策略,但默认为NullAuthenticatedSessionStrategy
,容易受到会话固定的影响。问题是为什么当弹簧claims to prevent session fixation by default?
解决此问题的最佳解决方案是什么?
答案 0 :(得分:5)
只有在使用命名空间时才会自动设置会话固定策略。如果您使用的是显式过滤器,那么您可以自己将SessionFixationProtectionStrategy
注入过滤器。或者,如果您的应用程序中存在明显的验证后起始点,则可以在那里重新创建会话。
由于过滤器优先于会话身份验证策略的引入,并且通常以保守的方式引入更改,因此默认情况下可能不会出于历史原因设置会话固定版本。您可以打开一个更改请求,建议默认情况下它可能更好。
答案 1 :(得分:3)
我遇到了同样的问题。我通过显式注入SessionFixationProtectionStrategy来解决它(基于命名空间的配置似乎不适用于我的CAS自定义过滤器)。这是我目前的配置:
<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/>
<bean id="sessionControlStrategy" class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
<constructor-arg ref="sessionRegistry"/>
<property name="maximumSessions" value="2"/>
</bean>
<bean id="casFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="sessionAuthenticationStrategy" ref="sessionControlStrategy"/>
</bean>