Spring Security自定义会话管理并记住我不工作

时间:2014-05-07 05:06:53

标签: spring-security remember-me session-management

我已经配置了自定义会话管理,如:

<sec:session-management session-fixation-protection="none">
<sec:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</sec:session-management>

请记住我:

<sec:remember-me />
<sec:custom-filter ref="rememberMeFilter" after="REMEMBER_ME_FILTER"/>

<bean id="rememberMeFilter" class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">


<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="theAuthenticationManager" />
</bean>

<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<property name="key" value="springRocks"/>
</bean>

<bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.rememberme.RememberMeAuthenticationProvider">
<property name="key" value="springRocks"/>
</bean>

当我登录并记住我检查并关闭浏览器并再次打开新浏览器并记住我不工作,而不是我得到会话超出错误。因为我已经设置了max-sessions = 1。

任何人都可以帮助我解决这个问题。

提前致谢。

1 个答案:

答案 0 :(得分:2)

我也面临同样的问题,我想使用会话并发控制以及记住我。我的配置略有不同,如果超过max-session,我不会向用户抛出错误,而是简单地使旧会话到期,以便用户可以继续新会话。使用弹簧提供的豆子不会按预期工作。当我第二次登录时,并发控制启动并使旧会话过期,然后用户继续新创建的会话。但是当用户尝试使用第一个会话访问系统时,ConcurrentSessionFilter会检测到此会话已过期并重定向到已配置的 expired-url ,这是正常的和预期的。

但我的要求不同,如果用户尝试使用第一个会话,则第二个会话应该过期并且应该重新验证用户,然后应该创建一个新会话以供用户继续。基本上,用户可以在不使用所记录的remember-me选项实际输入用户名/密码的情况下在不同浏览器之间切换,但服务器中只有一个活动会话。当用户在不同浏览器之间切换时,会话将过期/创建。

我设法通过扩展和自定义spring bean来实现这一目标。如果您的要求是相同的,我可以帮助您使用我的配置。