【问题标题】:How can I find out if my user has an admin permission?如何确定我的用户是否具有管理员权限?
【发布时间】:2018-12-05 13:42:15
【问题描述】:

我目前正在编写一个博客,以获取我可以登录的 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 的一部分,我在其中尝试获取登录用户的权限值并将其保存到会话中,如果它是“管理员”而不是“正常”:

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

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

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

【问题讨论】:

  • $stmt-&gt;fetch(PDO::FETCH_CLASS); 将返回 array("permission" =&gt; "admin") - 所以你应该这样做 return $isAdmin['permission']; (或者你可以这样做 $stmt-&gt;fetchColumn();
  • 另外,这里看起来您正在通过权限? isAdmin($user-&gt;permission),不应该是用户名吗?
  • 你说得对,我更正了。但是还是不行
  • 您应该使用您所做的更正来更新您问题中的代码,以便我们知道我们在同一个地方工作,尤其是因为还没有答案。
  • 如果您说“它仍然不起作用”,请您向我们展示您的 PHP 错误报告。 (在您的问题中,而不是在 cmets 中)

标签: php database session admin


【解决方案1】:

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

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

【讨论】:

  • 如何将 if 放入 PostsAdminController?像我以前那样在__Construct 中?存储库仅用于查询,没有其他用途,这就是控制器的用途
  • @ofmiceandmoon 我的 later code:... 块取自您引用 PostsAdminController 构造的问题。因此这个代码更改应该很明显?
  • 啊,当我询问登录用户是否有管理员权限时,我把它解释为我应该放在标题中的代码,我很抱歉
  • @ofmiceandmoon 不用担心 - 我已经更新了我的答案。
  • 谢谢你,很抱歉可能让你哭了,因为我知道的不多:D $_SESSION[] 解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
相关资源
最近更新 更多