我的系统不限制登录如果管理员


My system does not restrict login if admin

我有以下代码来检查登录:

 class User extends Password {
 private $_db;
 function __construct($db) {
  parent::__construct();
  $this->_db = $db;
 }
 private function get_user_hash($user) {
  try {
   $stmt = $this->_db->prepare('SELECT admin_id, user, pass FROM boss WHERE user = :user AND type = "admin"');
   $stmt->execute(array('user' => $user));
   return $stmt->fetch();
  } catch(PDOException $e) {
      echo '<p class="bg-danger">'.$e->getMessage().'</p>';
  }
 }
 public function login($user,$password) {
  $row = $this->get_user_hash($user);
  if($this->password_verify($password,$row['pass']) == 1) {
      $_SESSION['loggedin'] = true;
      $_SESSION['user'] = $row['user'];  
      return true;
  }
 }
 public function logout() {
  session_destroy();
 }
 public function is_logged_in() {
  if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true) {
   return true;
  }
 }
}
$user = new User($db);

一切正常工作,问题是我有两个目录"admin"answers"user"在每个都是"相同的文件",唯一的区别是在每个文件夹是不同的查询设置:

admin: SELECT admin_id, user, pass FROM Boss WHERE user = :user AND type = "admin"

user: SELECT admin_id, user, pass FROM users WHERE user =:user AND type = "user"

当将/admin更改为/user my verification code(上面)时应该区分是否为管理员。因为它不这样做,它通过会话和继续访问作为检查认为是这样。

在每一页"private"上我写了如下内容:

if ($user-> is_logged_in()) {header ('Location: user-area.php');}

我该怎么办?

如果你需要更多的代码来找到解决方案,那就告诉它。

我认为问题是在函数函数"is_logged_in",因为它必须修改配置文件admin检查,否则如果admin例如(不喜欢做某事):

public function is_logged_in_admin() {
  if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true && $row['type'] == "admin") {
   return true;
  }
 }

,然后检查:if($user->is_logged_in_admin()){header('Location: index.php?ruta=panel');}

这将是很好的,或者什么是正确的方式?

更新:你让它变得更难,然后必须,所有你需要做的就是复制你原来的用户类,并做以下更改

<?php
include('password.php');
class Admin extends Password{
    private $_db;
    function __construct($db){
        parent::__construct();
        $this->_db = $db;
    }
    private function get_user_hash($username){
        try {
            $stmt = $this->_db->prepare('SELECT password, username, adminID FROM admin WHERE username = :username AND active="Yes" ');
            //copy user table, name admin, change memberID to adminID
            $stmt->execute(array('username' => $username));
            return $stmt->fetch();
        } catch(PDOException $e) {
            echo '<p class="bg-danger">'.$e->getMessage().'</p>';
        }
    }
    public function login($username,$password){
        $row = $this->get_user_hash($username);
        if($this->password_verify($password,$row['password']) == 1){
            $_SESSION['loggedin'] = true;
            $_SESSION['username'] = $row['username'];
            $_SESSION['adminID'] = $row['adminID']; //change to adminID
            return true;
        }
    }
    public function logout(){
        session_destroy();
    }
    public function is_logged_in(){
        if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'] == true){
            return true;
        }
    }
}
?>

然后为管理员创建一个完全独立的登录/注销页面。如果您需要检查admin,它只是isset($_SESSION['adminID']),如果您需要检查用户,它是isset($_SESSION['memberID']),如果您需要查看他们是否登录,而不考虑admin或成员,它是isset($_SESSION['loggedin'])

这样99%的代码可以转换为管理端,只需根据会话中的ID更改表。

 $table = 'user';
 if(isset($_SESSION['memberID'])){
     $table = 'admin';
 }

作为单独登录的一个额外好处,您可以轻松地为管理员创建不使用密码的用户登录功能。如果您对两者使用相同的会话数据,这是不可能的。