首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何限制同一个用户Id多次登录?

如何限制同一个用户Id多次登录?
EN

Stack Overflow用户
提问于 2020-01-21 22:36:26
回答 1查看 433关注 0票数 1

我已经创建了一个REST应用程序。在此用户可以注册和登录。我有一个问题,比如如果A用户使用桌面-1登录,使用该凭据登录,而同一用户使用与桌面-2相同的凭据登录。我必须限制用户访问帐户。意味着如果用户使用-2\f25 desktop-2 \f6登录,我必须注销-2\f25 desktop-1 \f6帐户。

我如何使用spring安全来实现这一点?我可以使用JWT过滤器配置或使用spring安全进行会话管理吗?

有没有其他方法来处理我的情况?

EN

回答 1

Stack Overflow用户

发布于 2020-09-16 16:45:05

你在JWT中关于spring的问题。您希望强制用户仅使用一台设备登录。

我遇到了同样的问题(不是spring,而是node-express server,但解决方案是通用的,可以由任何语言和任何框架实现)。您面临这个问题的原因是由于JWT。

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

可能的解决方案是:(我也是在经过多次研究后实现的):

不要将JWT用于这些类型的应用程序,在这些应用程序中,用户会话应由设备号限制。而不是在内存数据库上使用随机令牌,比如redis。对于单个用户,创建一个随机令牌,如果登录成功,则通过纯http cookie将其发送到客户端,并将其保存在redis中,如db。那么每次用户发送请求时,你会自动收到cookie,然后你就可以用redis或其他内存中的数据库检查cookie,如果这样的cookie存在并且匹配,就意味着用户是真实的。

如果用户尝试再次登录,在redis数据库中将会有预先存在的令牌,因此您可以向用户发送响应,显示消息“logout from the previous device”,或者您可以更改令牌,使用户无法通过从旧设备发送的请求的身份验证。

**特别注意:我使用了redis,这并不意味着你必须使用相同的,你可以使用内存中的其他数据库,而且通用数据库也会像mongodb,MySQL或Pgsql等一样工作。但是这些传统的数据库查询需要额外的时间(延迟问题),这可能会导致额外的响应时间开销。内存中的dbs速度更快,因为访问RAM的速度更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59843421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档