我们正在使用spring security(org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy)来控制每个用户允许的登录次数。 这是完整的配置:
核心安全context.xml中
<bean id="sessionRegistry"
class="org.springframework.security.core.session.SessionRegistryImpl" />
<bean id="sessionStrategy"
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
<constructor-arg name="sessionRegistry" ref="sessionRegistry" />
<property name="maximumSessions"
value="${core.web.config.sessionStrategy.maximumSessions.value}" />
<property name="exceptionIfMaximumExceeded" value="true" />
</bean>
Web.xml中
<listener>
<listener -class>org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
core.web.config.sessionStrategy.maximumSessions.value的值设置为10。 根据我的理解,这意味着一个用户可以拥有10个不同的登录会话。当该用户同时尝试在第11位登录时,不应该允许他进入。
但在我们的情况下,用户可以同时成功登录5次,但是当我们尝试从第6位登录时,我们会得到以下异常:
Authentication request failed: org.springframework.security.web.authentication.session.SessionAuthenticationException: ConcurrentSessionControlStrategy.exceededAllowed
有没有人遇到类似的问题?调试它非常困难,因为这只发生在生产环境中。 QA,UAT等环境工作正常。 Prod和其他环境之间的一个重要区别是,prod中有多个应用程序服务器(在我们的例子中为4),其中QA和UAT只有1个服务器。这可能是原因还是其他原因。
在研究这个问题时,我注意到ConcurrentSessionControlStrategy类现已弃用。相反,它说使用ConcurrentSessionControlAuthenticationStrategy。知道为什么这个课程被剥离了吗?可能是因为那个班的一个错误吗?
public class UserInfo implements org.springframework.security.core.userdetails.UserDetails {
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
UserInfo other = (UserInfo) obj;
if (userEntityId == null) {
if (other.userEntityId != null)
return false;
} else if (!userEntityId.equals(other.userEntityId))
return false;
return true;
}
}
答案 0 :(得分:0)
您能否在Prod环境中确认core.web.config.sessionStrategy.maximumSessions.value
的属性值? Prod和其他环境可能有所不同。