Spring security Spring安全:登录PC和iPad时会话并发控制错误

Spring security Spring安全:登录PC和iPad时会话并发控制错误,spring-security,Spring Security,我的web应用程序使用Spring Security进行会话管理,我将并发控制最大会话数设置为1,如下所示: <session-management> <concurrency-control max-sessions="1" expired-url="/login" /> </session-management> 我有两个测试用例,如下所示 1) 仅在PC上的两个浏览器(任何浏览器)上登录同一用户 2) 先在PC上登录同一用户,然后在iPa

我的web应用程序使用Spring Security进行会话管理,我将并发控制最大会话数设置为1,如下所示:

<session-management>
    <concurrency-control max-sessions="1" expired-url="/login" />
</session-management>

我有两个测试用例,如下所示

  • 1) 仅在PC上的两个浏览器(任何浏览器)上登录同一用户
  • 2) 先在PC上登录同一用户,然后在iPad(Safari)上登录

预期结果是第一个会话中的用户将被踢出。实际结果是第一个结果通过,但第二个结果失败。当我在iPad上登录时,上一个会话不会被踢出。有人能给我一些建议吗?如何解决这个问题?我的iPad是iPad 2。

至少在spring 3.2中,SessionManagementConfigurer并发控制配置器类中有一个方法maxSessionsPreventsLogin。尝试将其设置为false,此时您似乎达到了其默认行为,即:

“如果为true,则阻止用户在
*{@link#maximumSessions(int)}已达到“

很可能您没有添加
HttpSessionEventPublisher
,如和中所述


您所需的行为是默认行为,但可以通过将
error if maximum excelled
属性设置为
true

设置“error if maximum excelled”(如果超过最大值,则会发生错误)来覆盖。但这并不是预期的结果。预期结果是,如果存在第二次登录,则第一次登录必须无效。和你登录雅虎一样,当你在这台机器上登录,然后又在另一台机器上登录时,第一次登录将无效并被踢出。请重新阅读我的答案。我说过默认行为是您所需要的,但可以通过使用此属性来覆盖(即获得不同的行为)。因此,如果您添加了
HttpSessionEventPublisher
,那么您的配置应该已经满足了您的要求。很抱歉,我误解了您的话。HttpSessionEventPublisher已经添加到web.xml中,但它仍然不能像我预期的那样工作。你对这个问题有什么想法吗?对不起,没有。应该行得通。您需要发布一些额外的信息,以表明问题实际上是由于多次登录而不是其他原因造成的。例如,如果使用不同的浏览器会发生什么?你的错误是什么?日志里有什么?