Spring安全性ConcurrentSessionControlStrategy问题

时间:2016-04-26 16:31:48

标签: session login spring-security concurrency controls

我们正在使用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;
    }

}

1 个答案:

答案 0 :(得分:0)

您能否在Prod环境中确认core.web.config.sessionStrategy.maximumSessions.value的属性值? Prod和其他环境可能有所不同。