我正在开发可在本地网络上运行的应用程序。它在前端使用javafx 8,在后端使用Postgresql服务器。该数据库位于网络中的数据库服务器中。在服务器中,我们有一个表,用于存储用户详细信息,包括加密的密码和用户ID。我们使用此表来验证希望登录的用户。
现在,我们要防止来自网络中多台计算机的同一用户ID登录到该应用程序。为此,我们尝试loggedin
在表中创建一个存储用户详细信息的列。然后在该列中存储布尔值true和false。因此,当用户成功通过身份验证后,我们将true
根据用户ID将其存储在column中loggedin
。当用户注销时,我们将更新到表以存储false
在列中。
这个过程引起了一个新的问题。如果在没有用户注销的情况下关闭了该应用程序,则该用户将永远无法再次登录。同样,如果在未注销用户的情况下关闭了用户的计算机,也会得到相同的结果。并且如果由于某种原因重新启动了服务器,则所有已登录的用户将永远无法再次登录。
我试图找到其他解决方案,但找不到任何解决方案。如果有人可以给我其他建议,那将非常有帮助。
如果您为每个用户赋予自己的数据库角色,则Postgres可以为您处理此任务(以及其余的身份验证过程):
CREATE USER <username> PASSWORD '<password>' CONNECTION LIMIT 1
这还有许多其他好处,例如通过授权和行级策略进行细粒度的访问控制,以及访问范围更广的身份验证方法。
如果这不是一个选择,则最简单的方法可能是在登录时获取会话级咨询锁,即:
SELECT pg_try_advisory_lock(<userid>)
true
如果您成功获取了锁,或者其他人已经拥有了该锁,则将返回false
该userid
值。一旦获得,该锁将在您的其余会话中保留,并在断开连接时自动释放。
请记住,您只是锁定一个任意数字,因此您需要确保没有其他过程出于不相关的原因而锁定相同的数字。管理此问题的一种常见方法是调用的两个参数的版本pg_try_advisory_lock()
,并users
通过传入表的内部标识符来将锁的作用域限定为表:
SELECT pg_try_advisory_lock('users'::regclass::int, <userid>)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句