我已经看到,如果我想在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的实现中也覆盖了hashCode
和equals
,但我仍然可以登录两次。我发现,在登录过程中,会调用hashCode()
,但永远不会调用equals()
。
我不知道它应该如何运作或何时应该调用equals()
,有人可以帮助我吗?
编辑:
@Override
public boolean equals(Object otherUser) {
if (otherUser.hashCode() == hashCode())
return true;
return false;
}
@Override
public int hashCode() {
return loginUsername.hashCode() ;
}
答案 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" />
现在修好了。谢谢大家的帮助。