MongoDB:如何处理两个用户同时上传相同的用户名或密码
Posted
技术标签:
【中文标题】MongoDB:如何处理两个用户同时上传相同的用户名或密码【英文标题】:MongoDB: How to handle two users uploading the same username or password at the same time 【发布时间】:2021-05-12 08:59:15 【问题描述】:这种情况可能不会发生太多,但我宁愿安全也不愿后悔。我目前正在尝试使用对我的数据库的 API 调用来使用 Flutter MongoDB 创建一个登录/注册系统。在注册屏幕上,我正在检查放入密码和用户名文本字段的数据是否已经存在于数据库中。换句话说,如果具有这些凭据的帐户已经存在,那么我会要求用户再试一次,但如果没有,那么我允许用户转到 EULA 并提交页面。
这里的问题是,我觉得两个或多个用户可以同时进行相同的检查,并且会得到相同的结果,因为虽然他们的信息可能匹配,但没有一个帐户实例这些凭据上传到数据库,以便系统告诉他们在进入提交页面之前停止。如果他们同时将他们在手机上写入的数据提交到数据库,就会出现这样一种情况,即我们在数据库中存在同种帐户的多个实例。
我知道密钥存在并且可以帮助使每个帐户彼此唯一,但是在这种情况下,我不确定如何处理或防止将相似或相同数据从本地设备同时上传到同一设备服务器。对我的服务器和 MongoDB 的调用是异步的吗?这是我需要担心的事情吗?
【问题讨论】:
【参考方案1】:TL;DR:如果您在 username
字段上使用 unique index,那么在尝试创建副本时会引发错误,您可以将其转发到用户的注册页面并让他们更改他们的名字。
长答案:
这更多的是 UX 问题而不是 DB 问题。 如果我理解正确,用户输入用户名和密码,然后在创建帐户之前阅读 EULA。
我不同意这一点 - 您应该在他们提交姓名后创建帐户,并使用 eulaAccepted
的布尔值更新它,以便如果此过程失败(例如连接不良),他们可以稍后再回来接受.
你应该做两组唯一的用户名验证:
-
当他们输入名称时,您可以检查他们并让他们知道该名称可用。这仍然意味着其他人可以在他们点击保存之前接受它。
一旦他们点击保存。在用户名字段上放置一个唯一索引。然后,如果用户尝试保存副本(即使同时提交,它们也会按顺序处理),那么它将引发错误。您可以将此转发给用户,提示他们尝试不同的名称。
回答您的其他问题:
对我的服务器和 MongoDB 的调用是异步的吗?
是的,当它们通过网络时,它们自然是异步的。但是数据库本身的保存是顺序的和原子的。 MongoDB 符合 ACID。仔细阅读它的含义,然后what changed in version 4
这是我需要担心的事情吗?
是的,密切关注此类问题是件好事。如果你现在不考虑,以后你手上就会有一个讨厌的错误。
【讨论】:
谢谢。我完全按照您所说的进行了实施,并且效果很好。我将唯一 ID 应用于数据库的用户名和密码字段,这只会降低重复的可能性。至少我知道在将来使用数据库时现在该做什么。以上是关于MongoDB:如何处理两个用户同时上传相同的用户名或密码的主要内容,如果未能解决你的问题,请参考以下文章