如何防止尝试创建相同的用户两次


How to prevent trying to create the same user twice?

场景是这样的:

  • 一个iPhone应用程序连接到一个WebServer与apache, PHP &MySQL。

  • iPhone应用程序的连接超时为5秒(Async NSURLConnection)。如果来自服务器的响应在超时之后出现,应用程序不知道并尝试再次发送数据。

  • 在服务器端php脚本运行两次。当第一组数据到达时。它在数据库中创建了一个新用户,但当应用程序超时时,它应该回送响应。应用程序第二次尝试创建用户时,它会收到一个错误,因为用户名应该是唯一的。这是因为php脚本第一次将用户插入到数据库中。

  • 在这种情况下,用户在服务器上创建,但用户不知道这一点,因为他收到一个错误,用户已经创建。

一些事情:
超时时间可以增加,但没关系。在负载下,服务器创建用户所需的时间甚至更多。
-我可以测试用户是否可以登录,而不是试图创建我只是登录他正常。这里的问题是,如果两个用户尝试使用相同的用户名和密码创建一个用户,会发生什么情况,因为在这种情况下,第二个用户将自动登录。在本例中,我确实可以添加一个检查,以查看用户是否是在最后一分钟创建的,如果是,就登录。(问题是,如果脚本执行时间超过1分钟,服务器应该首先崩溃,创建用户脚本执行时间为0.001秒,负载下执行时间为3-4秒)。

是否有任何方法来防止一个php脚本执行,如果另一个正在执行相同的数据?或者这个问题还有别的解决办法吗?

我不确定php路由,但iPhone方面的一个解决方案是在您的客户端http请求中包含来自UIDevice的identifierForVendor:的供应商特定设备标识符。这样您就可以识别创建请求是否来自同一设备(同一iPhone用户)或其他人。如果这个唯一的id不匹配,你可以给你的"对不起,这个用户名已被占用"的消息。

作为旁注,如果用户使用相同的用户名和密码创建一个用户,那么通常可以有效地假设它是同一个用户试图登录多个设备(例如iPhone和iPad)。这可能是您想要支持的用例。两个用户分别尝试创建相同的用户/密码帐户的可能性非常小。这种情况不太可能出现,而更常见的情况是,有人随机猜测用户名/密码组合,并通过该途径获得访问权限。如果您使用的是用户名/密码系统,则基本假设是这代表了可接受的风险水平。最小化这种风险的一些策略是使用密码复杂性规则,强制用户名是有效的和经过确认的电子邮件地址,在极端情况下使用双因素(或更多)身份验证。

在所有iphone中都有一个设备ID并且它们都是唯一的,在你的语言中验证一旦用户尝试使用他们的iphone注册你将如何获得那个。因此,使用该设备ID,他们不能注册多个。

第一种选择可能是假设他们是同一个用户(或者应该选择更好的密码)并让他们进入,就像@Aaron所说的。

另外两种可能性,取决于重复用户的重要性:1)使用电子邮件地址并让他们验证他们的用户创建操作。如果你收到一个重复的注册请求,你只需要设置一个相同的"查看你的电子邮件,点击这里重新发送"的屏幕。

2)使用数据库事务来确保同一时间只有一个连接可以登录/注册。可怕的可伸缩性。