0

我有一个使用 PHP 和 MySQL 设置的网站的用户登录系统。我的问题是我是否可以修改我现在拥有的东西,以创建一个“权限”系统。换句话说,只为用户显示某些控件,而为管理员显示不同的控件。在我的 mysql 表中,我有列'id''username''password'和一个带有 'a'、'b' 的 ENUM 'permissions'。'a' 是默认值(不是管理员)。下面我将向您展示我尝试过的方法。

这个文件是“ checklogin.php”(为了节省空间我不会添加所有代码)

//First I include variables to connect to the database & connect
//Then I define username and password as $_POST from a form on an earlier page
$user=a;
$admin=b;
$sql="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and permissions='$user'";
$sqladmin="SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword' and permissions='$admin'";
$result=mysql_query($sql);
$resultadmin=mysql_query($sqladmin);

$count=mysql_num_rows($result);
$countadmin=mysql_num_rows($resultadmin);

// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
 // Register $myusername, $mypassword and redirect to file "login_success.php"
 session_register("myusername");
 session_register("mypassword"); 
 session_register("user"); 
 header("location:login_success.php");
}
else {
  if($countadmin==1){
   session_register("myusername");
   session_register("mypassword"); 
   session_register("admin"); 
   header("location:login_success.php");
  }
  else {
    if($count==0) {
      if($countadmin==0) {
       echo "Wrong Username or Password";
      }
    }
  }
}

所以在这个文件中,我正在检查表中有多少行与用户输入匹配,以及它是否是管理员,如果有,那么我使用用户名、密码和权限注册一个会话。

接下来,我有文件“ login_success.php

<?php
session_start();
if(!session_is_registered(myusername)){
 header("location:main_login.php");
}
else {
}
?>
<html>
<body>
Login Successful

<?php
if(session_is_registered(admin)){
echo "Welcome Admin!";
}
else {
echo "Not admin...";
}
?>

上面的代码只是检查会话是否已注册,如果没有,则将您发送回登录表单。下面是一段代码,用于检查用户是否为管理员。这个工作的登录部分我只是无法计算出权限。

所以最后,我想我的问题是为什么这不起作用?这似乎在逻辑上是正确的。很抱歉这篇冗长的帖子。谢谢你的帮助。

4

3 回答 3

2

首先,您正在使用 deprecated session_register,session_is_registered。PHP 手册建议使用$_SESSION. session_is_registered需要字符串,但您不传递字符串 - 它应该类似于session_is_registered("admin"),而不是session_is_registered(admin)

另外,我认为您可以改进整个例程:

  1. 从数据库读取SELECT * FROM $tbl_name WHERE username='$myusername'(假设 $myusername 正确转义);
  2. 如果记录不存在,则用户名无效
  3. 检查密码(或从安全角度来看更好的哈希和)是否与存储的值匹配。如果不是,您可能需要增加“failed_login_attempts”字段
  4. 然后检查权限。我猜客户可能有超过 1 个角色。
于 2012-12-08T14:53:36.663 回答
2

首先,您对引号很懒惰,例如在以下几行中:

$user=a;
$admin=b;
if(!session_is_registered(myusername)){

但我不知道这是否是问题所在。

其次,您需要session_start()在使用会话之前调用。

为什么不直接执行以下查询?

SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'

然后您可以读取返回的权限,而不必摆弄复杂的双重查询设置。当然,您必须确保没有重复的用户名,但情况总是如此。

于 2012-12-08T14:56:43.923 回答
1

我建议您遵循以下逻辑:如果用户在其中一个列中有“a”,那么您对他的待遇不同。这意味着每个用户仍然只有一行。只有一个会话。相同的数据结构。同一届。但是根据“权限”列的价值,您可以在应用程序中为他打开更多“门”。您要做的就是检查他的会话的“权限”是否设置为“a”或将他标识为管理员的任何内容。

希望这可以帮助。格言

于 2012-12-08T14:51:50.177 回答