Java 未调用UserDetails.equals()
我已经看到,如果我想在spring security中激活并发控制,我必须添加:Java 未调用UserDetails.equals(),java,spring,spring-security,Java,Spring,Spring Security,我已经看到,如果我想在spring security中激活并发控制,我必须添加: <security:session-management> <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> </security:session-management> 到web.xml 我已经做到了。在UserDetails的实现中,我还覆盖了h
<security:session-management>
<security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</security:session-management>
到web.xml
我已经做到了。在UserDetails的实现中,我还覆盖了hashCode
和equals
,但我仍然可以登录两次。我发现,在登录过程中,调用了hashCode()
,但从未调用过equals()
我不知道它应该如何工作,或者什么时候应该调用equals()
,有人能帮我吗
编辑:
它可能真的起作用了。当我最后一次尝试时,我发现第二次登录是允许的,属于第一次登录的会话被破坏
试试这个,看看它是否有效。如果这不是您想要的行为,那么您可能必须查看文档,看看它是否可以通过配置进行控制。我发现,当您有身份验证筛选器时,您需要声明ConcurrentSessionControl策略,例如:
<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>
你的hashCode
看起来怎么样?我把它添加到了帖子中。你知道即使对象不是,hash代码也可以是相等的,不是吗?@zeroflagL这不是问题所在。没有人叫Equals。如果hashcode相等,那将是另一个问题,但这并不相关,因为似乎没有人比较它们。此外,应该发生的是哈希代码不相等,这就是为什么它允许同一用户的两个会话。是的,我知道这是一种可能性,但应该使用“如果最大值超过=真,则错误”来修复。无论如何,bth会话同时处于活动状态。不过还是谢谢你。我会继续努力的。
@Override
public boolean equals(Object otherUser) {
if (otherUser.hashCode() == hashCode())
return true;
return false;
}
@Override
public int hashCode() {
return loginUsername.hashCode() ;
}
<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>
<security:custom-filter position="CONCURRENT_SESSION_FILTER"
ref="concurrencyFilter" />
<security:session-management
session-authentication-strategy-ref="sas" />