属性<beans:property name =“maximumSessions”value =“1”>不起作用</beans:property>

时间:2012-12-08 15:33:10

标签: java spring session spring-security

我想限制用户的会话数量。

以下是我使用的示例配置(here):

<http>
  <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrencyFilter" />
  <custom-filter position="FORM_LOGIN_FILTER" ref="myAuthFilter" />

  <session-management session-authentication-strategy-ref="sas"/>
</http>

<beans:bean id="concurrencyFilter"
   class="org.springframework.security.web.session.ConcurrentSessionFilter">
  <beans:property name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="expiredUrl" value="/session-expired.htm" />
</beans:bean>

<beans:bean id="myAuthFilter" class=
   "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
  <beans:property name="sessionAuthenticationStrategy" ref="sas" />
  <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="sas" class=
 "org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
  <beans:constructor-arg name="sessionRegistry" ref="sessionRegistry" />
  <beans:property name="maximumSessions" value="1" />
</beans:bean>

<beans:bean id="sessionRegistry"
    class="org.springframework.security.core.session.SessionRegistryImpl" />

我没有收到任何错误,可以看到SessionRegistry中的用户数量。但maximumSessions值为1,我可以为一个用户创建2个会话(我使用了不同的浏览器)。

以下属性也没有导致任何例外情况:<beans:property name="exceptionIfMaximumExceeded" value="true" />。我还试图为UserDetails实现覆盖equals()hashCode()(因为它被建议为here)。

为什么我能够为具有此maximumSessions值的一个用户登录两次?我应该以其他方式限制会话号码吗?任何建议将不胜感激,提前谢谢。

1 个答案:

答案 0 :(得分:2)

我的不好,我没有用EqualsBuilder正确覆盖equals方法。如图所示here,在实际需要比较之前我有.appendSuper(super.equals(obj))行,所以即使相同的用户详细信息也不同。没有这条线,一切都很好,我无法登录两次。