如何确定我的用户是否具有管理员权限?

How can I find out if my user has an admin permission?

我目前正在编写博客以获取使用 php 的经验,我可以在其中登录。在 table:

user( id, username, password, permission)

有一个用户拥有 "admin" 权限,其他所有用户都拥有 "normal".

权限

我希望只有管理员可以编辑帖子,所以我需要找出当前登录用户有什么权限。我试着用 Sessions 来做,但不知何故我没能成功。

这是 UserRepository.php 中的查询,我在其中与 db

交互
public function isAdmin($username)
{
  $table = $this->getTableName();
  $model = $this->getModelName();

  $stmt = $this->pdo->prepare("SELECT `permission` FROM `{$table}` WHERE username = :username");
  $stmt->execute(['username' => $username]);

  $stmt->setFetchMode(PDO::FETCH_CLASS, $model);
  $isAdmin = $stmt->fetch(PDO::FETCH_CLASS);

  return $isAdmin;
} 

这是 LoginService.php 函数的一部分,我在其中调用存储库中的上层函数:

public function attempt($username, $password)
{
  $user = $this->userRepository->findByUsername($username);

  if (password_verify($password, $user->password)) { 
  if ($this->userRepository->isAdmin($user->username) == "admin") {
    $_SESSION['admin'] = "admin";
  }
  $_SESSION['login'] = $user->username;            
  session_regenerate_id(true);                    
  return true;                                      
}

这是 PostsAdminController.php__construct 的一部分,我在其中尝试获取已登录用户的权限值并将其保存到 session 如果它是 "admin" 而不是 "normal":

$username = $_SESSION['login'];
$permission = $this->userRepository->isAdmin($username);

if ($permission == "admin") {
  $_SESSION['admin'] = $permission;

我也有一部分 header,因为对于管理员来说,导航与普通用户不同。

<?php if(!empty ($_SESSION['login'])):?>
  <div class="logged-in-user">
    <div class="dropdown">
      <button class="dropbtn">
        <a href="http://localhost:8888/blog/public/index.php/dashboard">
          <?php echo e($_SESSION['login']);?>
        </a>
      </button>
    <div class="dropdown-content">
      <?php if ($_SESSION['admin'] == "admin"): ?>
        <a href="http://localhost:8888/blog/public/index.php/dashboard">
          dashboard
        </a>

这不会给我管理员和普通用户的仪表板。但是如果我问它是否设置:

<?php if (isset($_SESSION['admin'])): ?>

然后它再次在 dropdown-navigation 中显示仪表板...

我不知道为什么它不起作用,那么如何正确地找出登录用户的权限并根据他们的权限向他们展示不同的东西?

对您来说,return 函数的布尔值看起来更容易;而不是字符串值,那么您可以相对轻松地使用您的函数进行比较(请参阅答案底部)。

/***
 * Function for finding out if user is an admin
 * @param string $username 
 * @return bool isAdmin? 
 ***/
public function isAdmin($username)
{
  $table = $this->getTableName();
  $model = $this->getModelName();

  if(empty($username)){
     return false;
  }

  $stmt = $this->pdo->prepare("SELECT `permission` FROM `{$table}` WHERE username = :username");
  $stmt->execute(['username' => $username]);

  $stmt->setFetchMode(PDO::FETCH_CLASS, $model);
  $isAdminResult = $stmt->fetch(PDO::FETCH_CLASS); 

  if($isAdminResult['permission'] === "admin"){ 
      // YES this user is marked as an admin. 

      // You can also if you wish, save the admin details to a @_SESSION here
      // $_SESSION['admin'] == "admin";
      return true;
  }

  // No this user is not admin 
  return false;

} 

然后在您以后的代码中(例如在 PostsAdminController 构造中):

if($this->userRepository->isAdmin($username)){
    // $_SESSION['admin'] = "Yeeeaahhh";
    // whatever you want to run for admins only. 
}

比较 $_SESSION['admin'] 值比重复 运行 数据库和 class 方法调用更顺畅、更容易。