MongoDB: 如何处理两个用户同时上传相同的用户名或密码
MongoDB: How to handle two users uploading the same username or password at the same time
这种情况可能不会发生太多,但我宁愿安全也不要后悔。我目前正在尝试使用 API 调用我的数据库来创建一个带有 flutter MongoDB 的 in/sign 系统。在注册屏幕上,我正在检查数据库中是否已存在密码和用户名文本字段中的数据。换句话说,如果具有这些凭据的帐户已经存在,那么我会要求用户重试,但如果没有,那么我允许用户转到 EULA 并提交页面。
这里的问题是,我觉得两个或多个用户可以同时进行相同的检查,并且会得到相同的结果,因为虽然他们的信息可能匹配,但没有一个实例将这些凭据上传到数据库的帐户,以便系统告诉他们在转到提交页面之前停止。并且如果他们同时将他们在手机上写的数据提交到数据库,就会出现数据库中存在同种帐户的多个实例的情况。
我知道密钥存在并且可以帮助使每个帐户彼此唯一,但是,在这种情况下,我不确定如何处理或防止从本地设备同时上传相似或相同的数据到同一台服务器。对我的服务器和 MongoDB 的调用是异步的吗?这是我需要担心的事情吗?
TL;DR:如果您在 username
字段上使用 unique index,那么它会在尝试创建副本时引发错误,您可以将其转发给用户注册页面,让他们改名。
长答案:
这与其说是数据库问题,不如说是用户体验问题。
如果我理解正确,用户输入用户名和密码,然后在创建帐户之前阅读 EULA。
我不同意这一点 - 你应该在他们提交姓名后创建帐户,并使用 eulaAccepted
的布尔值更新它,以便如果此过程失败(例如连接不良)他们可以回来稍后接受。
您应该进行两组唯一的用户名验证:
- 当他们输入姓名时,您可以检查他们并让他们知道该姓名可用。这仍然意味着其他人可以在点击保存之前接受它。
- 一旦他们点击保存。在用户名字段上放置一个唯一索引。然后,如果用户尝试保存副本(即使同时提交,它们将按顺序处理),则会引发错误。您可以将其转发给用户,提示他们尝试使用不同的名称。
正在回答您的其他问题:
Are calls to my server and MongoDB asynchronous?
是的,当它们通过网络时,它们自然是异步的。但是数据库本身内部的保存是顺序的和原子的。 MongoDB 是 ACID compliant. have a read through what it means, and what changed in version 4
Is this something that I need to worry about at all?
是的,关注这类问题是件好事。如果你现在不考虑,以后你手上就会有一个讨厌的错误。
这种情况可能不会发生太多,但我宁愿安全也不要后悔。我目前正在尝试使用 API 调用我的数据库来创建一个带有 flutter MongoDB 的 in/sign 系统。在注册屏幕上,我正在检查数据库中是否已存在密码和用户名文本字段中的数据。换句话说,如果具有这些凭据的帐户已经存在,那么我会要求用户重试,但如果没有,那么我允许用户转到 EULA 并提交页面。
这里的问题是,我觉得两个或多个用户可以同时进行相同的检查,并且会得到相同的结果,因为虽然他们的信息可能匹配,但没有一个实例将这些凭据上传到数据库的帐户,以便系统告诉他们在转到提交页面之前停止。并且如果他们同时将他们在手机上写的数据提交到数据库,就会出现数据库中存在同种帐户的多个实例的情况。
我知道密钥存在并且可以帮助使每个帐户彼此唯一,但是,在这种情况下,我不确定如何处理或防止从本地设备同时上传相似或相同的数据到同一台服务器。对我的服务器和 MongoDB 的调用是异步的吗?这是我需要担心的事情吗?
TL;DR:如果您在 username
字段上使用 unique index,那么它会在尝试创建副本时引发错误,您可以将其转发给用户注册页面,让他们改名。
长答案:
这与其说是数据库问题,不如说是用户体验问题。 如果我理解正确,用户输入用户名和密码,然后在创建帐户之前阅读 EULA。
我不同意这一点 - 你应该在他们提交姓名后创建帐户,并使用 eulaAccepted
的布尔值更新它,以便如果此过程失败(例如连接不良)他们可以回来稍后接受。
您应该进行两组唯一的用户名验证:
- 当他们输入姓名时,您可以检查他们并让他们知道该姓名可用。这仍然意味着其他人可以在点击保存之前接受它。
- 一旦他们点击保存。在用户名字段上放置一个唯一索引。然后,如果用户尝试保存副本(即使同时提交,它们将按顺序处理),则会引发错误。您可以将其转发给用户,提示他们尝试使用不同的名称。
正在回答您的其他问题:
Are calls to my server and MongoDB asynchronous?
是的,当它们通过网络时,它们自然是异步的。但是数据库本身内部的保存是顺序的和原子的。 MongoDB 是 ACID compliant. have a read through what it means, and what changed in version 4
Is this something that I need to worry about at all?
是的,关注这类问题是件好事。如果你现在不考虑,以后你手上就会有一个讨厌的错误。