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

时间:2018-12-05 13:42:16

标签: php database session admin

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

user( id, username, password, permission)

有一个用户的权限为“ admin”,其他每个用户的权限为“ normal”。

我希望只有管理员才能编辑帖子,因此我需要找出当前登录用户所拥有的权限。我试图通过Sessions来做到这一点,但是不知何故我无法使其正常工作。

这是我与数据库交互的UserRepository.php中的查询

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;                                      
}

这是__constructPostsAdminController.php的一部分,我试图在其中获取已登录用户的权限值并将其保存到会话中(如果它是“ admin”而不是“正常”:

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

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

我还有一部分标题,因为对于管理员来说,导航和普通用户是不同的。

<?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'])): ?>

然后它再次在下拉菜单中显示两个仪表板...

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

1 个答案:

答案 0 :(得分:2)

为您的函数返回一个布尔值看起来更容易。而不是字符串值,那么您可以相对轻松地在比较中使用函数(请参见答案底部)。

/***
 * 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']值更平滑,更容易。