Spring Security:在PC和iPad上登录时会话并发控制错误



我的web应用程序使用Spring Security进行会话管理,我设置并发控制max-sessions = 1如下:

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

我有如下2个测试用例

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

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

很可能您没有像参考手册和常见问题解答中所描述的那样添加HttpSessionEventPublisher

您需要的行为是默认的,但可以通过将error-if-maximum-exceeded属性设置为true来覆盖。

至少在spring 3.2中有一个方法maxSessionsPreventsLogin在SessionManagementConfigurer ConcurrencyControlConfigurer类。试着把它设为false,似乎你击中了它的默认行为,那是:

"如果为真,则阻止用户进行身份验证* {@ link# maximumSessions(int)}已达到"

最新更新