我希望我的用户在他们能够登录之前激活他们的帐户。他们在注册后发送一封包含激活链接的电子邮件,如下所示:
http://www.blabla.com/activate.php?email=blabla@blabla.com&token=Aisd23uNMAu53932asdDasd82AS
当然,每当有人登录时,我都必须检查用户是否激活了他/她的帐户。我可以想到两种方法来解决这个问题,要么在我的'users'表中有一个额外的列,只要用户激活就会设置为空:
-----------------------------------------------
| id | username | password | activation_token |
-----------------------------------------------
| 1 | user1 | blabla | |
-----------------------------------------------
| 2 | user1 | blabla | asd232DA34qADJs2 |
-----------------------------------------------
然后,每当用户登录时,我都会提取activation_token和用户信息。或者我可以有一个仅包含激活令牌的单独表,然后每次用户登录时都会在'users'表中加入:< / p>
--------------------------------------
| id | account_id | activation_token |
--------------------------------------
| 1 | 37 | dsad2428491dka98 |
--------------------------------------
| 2 | 2 | asd232DA34qADJs2 |
--------------------------------------
哪一个效率最高?谢谢你的时间。
编辑:感谢所有精彩回复
答案 0 :(得分:4)
就个人而言,我会把两者结合起来......
-------------------------------------
| id | username | password | status |
-------------------------------------
| 1 | user1 | blabla | 1 |
-------------------------------------
| 2 | user1 | blabla | 0 |
-------------------------------------
状态为TINYINT(1)
字段,对于已停用的用户为0,对于已激活的用户为1。这样,您可以非常快速地告诉用户的“状态”......
然后,将令牌存储在另一个表中(就像您已经拥有的那样)......这样,您不需要加入,或者在不激活帐户时检查字符串列...
答案 1 :(得分:1)
使用第一个选项 - 将isactivated
列添加到USERS
表。
不需要单独的表 - 这是一对一的关系。
答案 2 :(得分:1)
将令牌存储在Users表而不是单独的表中意味着您不必在每次查询期间加入它们,这会稍快一些。
此外,您没有存储userIds并为该令牌表创建新的Id,这将节省数据存储。
答案 3 :(得分:1)
我有一个整数字段,Activated,默认为0.当有人尝试身份验证时,您只会查找已激活的帐户。我将auth令牌存储在您所描述的单独表中。
答案 4 :(得分:1)
如果关系是1-1(例如,激活表每个帐户ID将有1行),那么执行完全规范化的2表方法是一种过度杀伤力。
你不会遇到任何一种方法的主要问题,但是1-table one更容易。
如果使用2-table方法,则应在用户表中存储“激活”是/否标志,因此您无需加入第二个表以进行用户登录。
答案 5 :(得分:1)
如果激活令牌仅用于验证“点击此处激活您的帐户”链接并且永远不会再次使用,那么在您的用户表中浪费存储char(32)
(或其他任何内容)的空间毫无意义它是一次性使用的字段。将激活令牌放在一个单独的表中,当用户点击激活时,您的帐户激活脚本可以参考该表。激活完成后,您可以从该单独的表中删除令牌的记录。
在登录过程中登录脚本可以检查的用户表中放置一个'is_activated'布尔/位字段(如果字段为null / false,则输出“嘿,你还没有激活”错误)。 / p>
当然,如今磁盘空间很便宜。即使是每个拥有32char激活令牌的百万用户也只会“浪费”32meg的空间。如果磁盘驱动器的价格低于100美元,则为磁盘的0.00305%,基本上为0.00美元(0.305美分)。
答案 6 :(得分:0)
我认为不需要在DB中存储激活令牌。像md5('users @ email'。'secret')之类的东西可以正常工作。至于用户状态,我同意其他人的意见,在users表中使用单独的专用“status”列。另一个优点是该列也可以存储其他stati(例如“禁止”;)
答案 7 :(得分:0)
在我看来,不是将激活码存储在用户表中,而是默认情况下将标志设置为关闭。当用户点击任何激活链接时,然后更新表并设置标志。
登录前检查标志是否开启。 如果标志已关闭,则用户未单击激活链接。然后你可以给用户一个错误信息。
如果启用了标记,则用户可以成功登录。