4

我有一个使用spring security和CAS(spring 3.0.5,cas 3.4.5)的应用程序,但是当我登录时会话ID没有改变。

当我登录CasAuthenticationFilter执行身份验证时,如果身份验证成功,它不会继续过滤器链,而是在 上设置身份验证SecurityContextHolder并调用 successHandler。这将重定向到我请求的需要身份验证的原始 URL。SessionManagementFilter永远不会调用会话策略来创建新会话。

似乎 that AbstractAuthenticationFilterextendsCasAuthenticationFilter有自己的会话策略,但默认的NullAuthenticatedSessionStrategy是容易受到会话固定的影响。问题是为什么默认策略容易受到攻击,当 spring声称默认防止会话固定时

解决此问题的最佳解决方案是什么?

4

2 回答 2

5

会话固定策略仅在您使用命名空间时自动设置。如果您使用的是显式过滤器,那么您可以SessionFixationProtectionStrategy自己将 a 注入过滤器。或者,如果您的应用程序中有一个明显的身份验证后起点,您可以在那里重新创建会话。

由于历史原因,默认情况下可能未设置会话固定版本,因为过滤器早于会话身份验证策略的引入,并且通常以保守的方式引入更改。您可以打开一个更改请求,建议默认情况下它可能会更好。

于 2013-01-31T12:49:50.833 回答
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>
于 2013-12-12T12:24:10.253 回答