php - 如何查明我的用户是否具有管理员权限?

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

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

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

然后它再次在下拉导航中显示仪表板...

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

最佳答案

对于你来说,为你的函数返回一个 bool 值看起来更容易;而不是字符串值,那么您可以相对轻松地使用您的函数进行比较(参见答案底部)。

/***
 * 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'] 值比重复运行数据库和类方法调用更顺畅、更容易。

关于php - 如何查明我的用户是否具有管理员权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53633728/

相关文章:

javascript - 使用 Knex.js : bind message supplies X parameters, 时出现批量插入错误,但准备好的语句 ""需要 Y

django - Django Session中 '/tmp'的文件路径

node.js - express 和 socket.io 身份验证——如何检索 cookie/ session 信息?

php - WC_Order->get_items() 返回空项目

php - 使用 PHP 生成长报告

Javascript 不检查组合网格更改的文本输入值

php - var_dump(0 == 'all');//为什么为真

php - Laravel 加入,包括没有匹配的地方

sql - 从 Oracle 中的选择创建表

http - 访问容器管理的 session 监听器