【发布时间】:2011-04-11 19:12:06
【问题描述】:
我不知道以前是否有人问过这个问题,但我会解决它。
如果您要在 PHP 中创建一个允许用户注册和登录的系统 - 包括用户级别。您将如何完全创建这个系统。提醒自己关于会话,当小心会话时,你会做的最佳方法到底是什么——我的意思是在包括密码(当然是散列)、用户级别等时进行会话劫持。我发现自己在编写用户登录系统时,使用会话显示模块时这是一种糟糕的方法,如下所示:
if(isset($_SESSION['user']) && isset($_SESSION['user_level']))
{
if($_SESSION['user_level'] == 3)
{
// show admin tools
}
elseif($_SESSION['user_level'] == 2)
{
// show moderator tools
}
}
我什至用过这样的东西:
if(isset($_SESSION['user']) && !empty($_SESSION['user']))
{
$sql = "SELECT user_id, username, user_level
FROM members
WHERE username = '" . $_SESSION['user'] . "'";
$result = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($result) == 1)
{
while($row = mysql_fetch_array($result))
{
$uid = $row['user_id'];
$u_name = $row['username'];
$u_level = $row['user_level'];
}
}
}
所以当我使用这样的东西时:
if($u_level == 3)
{
// show admin tools
}
不是更好的例子吗?
【问题讨论】:
-
您可以序列化用户对象并将其与提供用户 ID 一起散列。然后,您可以使用用户 ID 从数据库中检索它,并对其执行相同的序列化、哈希组合以检查匹配。此外,对于您的用户级别,请考虑使用更大的数字间隔。这允许在您已经拥有的用户之间插入不同的用户类型,例如管理员和版主类型之间的“超级版主”。
-
序列化和散列用户对象?听起来是个坏主意……为什么要序列化东西的开销?无论如何,您都需要访问数据库来验证哈希...您能解释一下为什么序列化是个好主意吗?
-
您可以考虑修改问题的标题,因为它涉及的注册和登录比用户权限/访问/会话控制要少。