SpringSecurity5 限制账号的登陆数

回到序章

来来来,点这

需要实现的目的

一个账号不能重复登陆,或强制登陆上一个账号,或后登陆的直接提示登陆失败。

实现步骤

单单实现的话,不难,更新一下配置类:

1
2
3
4
5
6
7
8
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.maximumSessions(1)
.maxSessionsPreventsLogin(true)
;
}

像上面,增加 http.sessionManagement().maximumSessions(1) 即可实现后登陆的顶掉先登陆的,先登陆的再次请求接口,会得到 This session has been expired (possibly due to multiple concurrent logins being attempted as the same user). 的错误信息。

如果不想踢掉先登陆的,而是限制后登陆的不允许登陆。则在上面的基础上增加 .maxSessionsPreventsLogin(true) 即可。如此,后登陆的会提示 已经超过了当前主体(1)被允许的最大会话数量 的错误信息。

想限制能登几个,就修改 .maximumSessions(1) 中的阿拉伯数字。

登录后无法登陆问题

自此,功能便实现了,但是如果你是使用后登陆者不被允许登陆这种方式的话,可能会出现退出登陆后无法再次登陆的问题。

原因:因为 spring security 通过监听 session 的销毁事件处理逻辑的,而登出的事件这里是通过 session 实现的,但是 session 本身的创建和销毁事件,并不会通知到 Spring 容器,所以会导致即时你登出了,但是 spring security 仍然认为你是登陆中,导致使用不允许后登陆者这种登陆方式的用户无法再次登陆。

解决方法也简单,首先要知道一个点,