首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP & MySQL用户登录和权限系统

PHP & MySQL用户登录和权限系统
EN

Stack Overflow用户
提问于 2012-12-08 22:42:42
回答 3查看 10.3K关注 0票数 0

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

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

代码语言:javascript
复制
//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";
      }
    }
  }
}

因此,在这个文件中,我检查表中有多少行与用户输入匹配,是否为admin,如果有,则使用用户名、密码和权限注册一个会话。

接下来,我有一个文件"login_success.php

代码语言:javascript
复制
<?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...";
}
?>

上面的代码只是检查会话是否已注册,如果没有,则返回到登录表单。下面是一段检查用户是否是管理员的代码。登录部分的工作,我只是不能计算出权限。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-08 22:51:50

我建议你的逻辑如下:如果一个用户在他的一个专栏中有"a“,那么你对待他的方式就不同了。这意味着每个用户仍然只有一行。只有一次会话。相同的数据结构。相同的会话。但是基于“权限”列的值,你可以在你的应用程序中为他打开更多的“门”。你所要做的就是检查他的会话的“权限”是否被设置为"a“或者任何标识他为admin的东西。

希望这能有所帮助。格言

票数 1
EN

Stack Overflow用户

发布于 2012-12-08 22:53:37

首先,您使用的是过时的session_register,session_is_registered。Php手册推荐使用$_SESSIONsession_is_registered需要字符串,但您没有传递字符串-它应该类似于session_is_registered("admin"),而不是session_is_registered(admin)

另外,我认为你可以改进整个程序:

  1. 从数据库SELECT * FROM $tbl_name WHERE username='$myusername'读取(假设$myusername正确转义);
  2. 如果记录不存在,如果密码(或从安全角度看要好得多的哈希和)与存储值匹配,则用户名为invalid
  3. Check。如果不是,您可能想要增加"failed_login_attempts“字段
  4. ,然后检查权限。我猜客户可能有多个角色。
票数 2
EN

Stack Overflow用户

发布于 2012-12-08 22:56:44

首先,您懒惰地使用引号,例如在以下几行中:

代码语言:javascript
复制
$user=a;
$admin=b;
if(!session_is_registered(myusername)){

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

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

为什么不执行下面的查询呢?

代码语言:javascript
复制
SELECT * FROM $tbl_name WHERE username='$myusername' and password='$mypassword'

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13778521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档