如何限制一个用户ID的多次登录?

时间:2020-01-21 14:36:25

标签: spring-boot spring-security jwt-auth

我已经创建了一个REST应用程序。在此用户可以注册和登录。我有一个问题,例如,如果A用户使用带有凭据的Desktop-1登录,而同一用户使用带有Desktop-2的凭据登录。我必须限制用户访问帐户。意味着如果用户使用desktop-2登录,则我必须注销desktop-1帐户。

如何使用Spring Security实现此目的? 我可以使用JWT Filter配置或具有Spring Security的会话管理来做到这一点吗?

还有其他方法可以处理我的情况吗?

1 个答案:

答案 0 :(得分:0)

您与JWT有关春季的问题。您要强制用户仅使用1台设备登录。

我遇到了同样的问题(不是使用spring而是使用node-express服务器,但是解决方案是通用的,可以用任何具有任何框架的语言来实现)。您遇到此问题的原因是JWT。

JWT是无状态的,因此服务器不知道有多少用户以及在哪些设备上保存了JWT令牌。服务器只能验证JWT,而不能强制用户仅在特定设备上使用它。为此,您必须跟踪服务器中的所有JWT(向哪个用户和何时发出问题),这确实违反了JWT无状态体系结构的原则。

解决方案是:(我也经过大量研究也实现了):

请勿将JWT用于这类应由设备编号限制用户会话的应用程序。 相反,像redis一样在内存数据库上使用随机令牌。对于单个用户,如果登录成功,则创建一个随机令牌并将其通过仅HTTP cookie发送给客户端,并将其保存在db之类的redis中。然后,每次用户发送请求时,您都会自动收到cookie,然后可以通过redis或其他内存数据库检查cookie,如果存在并且匹配,则表明用户是真实的。

如果用户尝试再次登录,则redis数据库中将已经存在现有令牌,因此您可以向用户发送响应,显示消息“从先前设备注销”,也可以更改令牌,使用户无法对于从旧设备发送的请求进行身份验证。

**特别说明:我使用过redis,这并不意味着您必须使用相同的数据库,也可以在内存中使用其他数据库,也可以使用普通数据库,如mongodb,MySQL或Pgsql等。但是这些传统的数据库查询花费了额外的时间(延迟问题),这可能会导致额外的响应时间开销。内存中的数据库速度很快,因为访问RAM的速度相当快。