Как я могу узнать, есть ли у моего пользователя права администратора? - PullRequest
0 голосов
/ 05 декабря 2018

В настоящее время я пишу блог, чтобы получить опыт работы с php, в котором я могу войти в систему. В таблице:

user( id, username, password, permission)

есть один пользователь, имеющий разрешение «admin», любой другой пользовательимеет разрешение «нормальный».

Я хочу, чтобы редактировать сообщения мог только администратор, поэтому мне нужно выяснить, какое разрешение имеет текущий вошедший в систему пользователь.Я пытался сделать это с помощью сеансов, но каким-то образом мне не удалось заставить его работать.

Это запрос в 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;                                      
}

Это часть __construct в PostsAdminController.php, в которой я пытаюсь получить значение разрешения авторизованного пользователя и сохранить его всеанс, если это "admin", а не "normal":

$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 голосов
/ 05 декабря 2018

Вам просто проще вернуть логическое значение для вашей функции;вместо строкового значения вы можете использовать свою функцию в сравнительных сравнениях (см. нижнюю часть ответа).

/***
 * 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'] проще и проще, чем повторно запускать базу данных и вызов метода класса.

...