gpt4 book ai didi

java - 如何防止使用同一用户名多次登录?

转载 作者:行者123 更新时间:2023-11-29 12:03:32 25 4
gpt4 key购买 nike

我正在开发一个在本地网络上运行的应用程序。它在前端使用 javafx 8,在后端使用 Postgresql 服务器。数据库存在于网络中的数据库服务器中。在服务器中,我们有一个存储用户详细信息的表,包括加密密码和用户 ID。我们使用此表来验证希望登录的用户。

现在我们要防止网络中的多台计算机使用同一个用户名登录应用程序。为此,我们尝试在存储用户详细信息的表中创建一个列 loggedin。然后在列中存储 boolean 值 true 和 false。因此,当用户成功通过身份验证后,我们将 trueloggedin 列中的用户 ID 相对应。当用户注销时,我们更新表以在列中存储 false

这个过程产生了一个新问题。如果应用程序在用户未注销的情况下关闭,用户将永远无法再次登录。此外,如果用户的计算机在用户未注销的情况下关闭,也会产生相同的结果。如果由于某种原因服务器重新启动,那么所有登录的用户将永远无法再次登录。

我试图找到其他解决方案,但找不到任何解决方案。如果有人能给我其他建议,那将非常有帮助。

最佳答案

如果你给每个用户他们自己的数据库角色,Postgres 可以为你处理这个(连同其余的身份验证过程):

CREATE USER <username> PASSWORD '<password>' CONNECTION LIMIT 1

这还有许多其他好处,例如通过 grants 进行细粒度访问控制。和 row-level policies ,并访问范围更广的 authentication methods .

如果这不是一个选项,最简单的方法可能是获取 session-level advisory lock登录时,即:

SELECT pg_try_advisory_lock(<userid>)

如果您已成功获取锁,这将返回 true,如果该 userid 的锁已被其他人持有,则返回 false .一旦获得,锁将在您的 session 的其余部分保持,并在断开连接时自动释放。

请记住,您只是锁定了一个任意数字,因此您需要确保没有其他进程出于不相关的原因锁定同一个数字。一种常见的管理方法是调用 pg_try_advisory_lock() 的双参数版本,并通过传入表的内部标识符将锁范围锁定到 users 表:

SELECT pg_try_advisory_lock('users'::regclass::int, <userid>)

关于java - 如何防止使用同一用户名多次登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41115683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com