UserDetails.equals()未调用

时间:2013-12-19 15:46:10

标签: java spring spring-security

我已经看到,如果我想在spring security中激活并发控制,我必须添加:

 <security:session-management>
     <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
 </security:session-management>

applicationContext和:

 <listener>
    <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
 </listener>

web.xml

我做到了。我在UserDetails的实现中也覆盖了hashCodeequals,但我仍然可以登录两次。我发现,在登录过程中,会调用hashCode(),但永远不会调用equals()

我不知道它应该如何运作或何时应该调用equals(),有人可以帮助我吗?

编辑:

@Override
public boolean equals(Object otherUser) {
   if (otherUser.hashCode() == hashCode())
       return true;

   return false;
}

@Override
public int hashCode() {

    return loginUsername.hashCode() ;
}

2 个答案:

答案 0 :(得分:1)

它实际上可能正在发挥作用。当我上次尝试这个时,我发现允许第二次登录,并且属于第一次登录的会话被销毁。

试试这个,看它是否有效。如果这不是您想要的行为,那么您可能需要查看文档以查看是否可以通过配置来控制它。

答案 1 :(得分:1)

我发现,当你有一个身份验证过滤器时,你需要声明一个ConcurrentSessionControlStrategy,例如:

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

<http></http>

之间
<security:custom-filter position="CONCURRENT_SESSION_FILTER"
            ref="concurrencyFilter" />

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

现在修好了。谢谢大家的帮助。