2

我希望我的用户在能够登录之前激活他们的帐户。注册后他们会收到一封包含激活链接的电子邮件,如下所示:

http://www.blabla.com/activate.php?email=blabla@blabla.com&token=Aisd23uNMAu53932asdDasd82AS

当然,每当有人登录时,我都必须检查该用户是否激活了他/她的帐户。我可以想到 2 种方法来解决这个问题,要么在我的“用户”表中有一个额外的列,当用户像这样激活时,它被设置为空:

-----------------------------------------------
| id | username | password | activation_token |
-----------------------------------------------
| 1  | user1    | blabla   |                  |
-----------------------------------------------
| 2  | user1    | blabla   | asd232DA34qADJs2 |
-----------------------------------------------

然后,每当用户登录时,我都会提取activation_token 以及用户信息。或者我可以有一个仅包含激活令牌的单独表,然后每次用户登录时将其加入“用户”表:

--------------------------------------
| id | account_id | activation_token |
--------------------------------------
| 1  | 37         | dsad2428491dka98 |
--------------------------------------
| 2  | 2          | asd232DA34qADJs2 |
--------------------------------------

那么哪个最有效呢?谢谢你的时间。

编辑:感谢所有伟大的回应

4

8 回答 8

4

就个人而言,我会做两者的结合......

-------------------------------------
| id | username | password | status |
-------------------------------------
| 1  | user1    | blabla   | 1      |
-------------------------------------
| 2  | user1    | blabla   | 0      |
-------------------------------------

其中 status 是一个TINYINT(1)字段,0 表示已停用的用户,1 表示已激活的用户。这样,您可以非常快速地了解用户的“状态”......

然后,将令牌存储在另一个表中(就像您已经拥有的一样)...这样,您无需在未激活帐户时加入或检查字符串列...

于 2010-08-03T15:25:22.323 回答
1

使用第一个选项 -isactivated向表中添加一列USERS

不需要单独的表 - 这是一对一的关系。

于 2010-08-03T15:24:07.053 回答
1

将令牌存储在用户表而不是单独的表中意味着您不必在每次查询期间加入它们,这会稍微快一些。

此外,您不会存储 userIds 并为该令牌表创建一个新的 Id,这将节省数据存储。

于 2010-08-03T15:24:36.153 回答
1

我将有一个整数字段,已激活,默认为 0。当有人尝试进行身份验证时,您只会查找已激活的帐户。就像您描述的那样,我将身份验证令牌存储在单独的表中。

于 2010-08-03T15:24:48.160 回答
1

如果关系是 1-1(例如,激活表每个帐户 id 将有 1 行),那么执行完全规范化的 2 表方法是过大的。

这两种方法都不会有大问题,但 1-table 更容易。

如果您使用 2-table 方法,您应该在用户表中存储“激活”是/否标志,因此您不需要加入第二个表以进行用户登录。

于 2010-08-03T15:26:31.530 回答
1

如果激活令牌仅用于验证“单击此处以激活您的帐户”链接并且不再使用,那么在您的用户表中浪费空间存储char(32)(或任何它是)字段是没有意义的 -时间使用。将激活令牌放在单独的表中,当用户单击激活时,您的帐户激活脚本可以参考该表。激活完成后,您可以从该单独的表中删除令牌的记录。

在用户表中放置一个“is_activated”布尔/位字段,您的登录脚本可以在登录过程中检查该字段(如果该字段为 null/false,则输出“嘿,您尚未激活”错误)。

当然,现在磁盘空间很便宜。即使是每个拥有 32char 激活令牌的一百万用户也只会“浪费”32meg 的空间。一个 TB 驱动器的价格低于 100 美元,占磁盘的 0.00305%,成本基本上是 0.00 美元(0.305 美分)。

于 2010-08-03T18:10:17.697 回答
0

我认为不需要将激活令牌存储在数据库中。像 md5('users@email' . 'secret') 这样的东西可以正常工作。至于用户状态,我同意其他人的观点,在用户表中使用单独的专用“状态”列。另一个优点是该列也可以存储其他统计信息(例如“禁止”;)

于 2010-08-03T15:52:05.290 回答
0

在我看来,与其将激活码存储在用户表中,不如保留一个默认设置的标志。当用户单击任何激活链接时,更新表并设置标志。

在登录之前检查标志是否打开。如果标志关闭,则用户没有点击激活链接。然后你可以给用户一个错误信息。

如果标志打开,则用户可以成功登录。

于 2010-08-04T10:42:13.273 回答