Как создать две разные сессии в зависимости от привилегий пользователя в MySQL и PHP - PullRequest
0 голосов
/ 22 мая 2019

Я хочу иметь два разных сеанса - сеанс администратора и сеанс обычного пользователя, в зависимости от того, на что установлена ​​их привилегия. У меня есть следующие таблицы:

---- LOGIN ----

Login ID | Username  | Password          | StaffID (FK) 
-------------------------------------------------------
1        | bob.jones | *hashed password* | 1

---- ROLES ---- 

RoleID | Role   | Privilege
---------------------------
1      | Worker | Normal 
2      | CEO    | Admin

---- JOBS ----

JobID | StaffID | PlaceID | RoleID
---------------------------------- 
1     | 1       | 1       | 1 
2     | 2       | 1       | 2

У меня есть следующий фрагмент из моего процесса входа в систему. Здесь привилегия установлена ​​в Enum.

...
else if ($pwdCheck == True){  
  session_start();
  $query = mysqli_query($conn, 'SELECT staff.StaffID, role.Privilege FROM
    jobs
    INNER JOIN staff ON staff.StaffID = jobs.StaffID
    INNER JOIN role ON role.RoleID = jobs.RoleID
    WHERE login.Username = ?????????');

  $gettier = mysqli_fetch_assoc($query);

  if((int)$gettier["Privilege"] === 0){
    $_SESSION['userID'] = $row['LoginID'];
    header("Location: staffindex.php?login=USERsuccess");
  }
  elseif((int)$gettier["Privilege"] === 1){
    $_SESSION['AdminID'] = $row['LoginID'];
    header("Location: staffindex.php?login=ADMINsuccess");
  }

  exit();
}

Любая помощь приветствуется, Спасибо

1 Ответ

0 голосов
/ 22 мая 2019

Как указано в вашем комментарии, вы выполняете запрос, который может вернуть несколько строк для человека, имеющего как администраторскую, так и обычную роль, по одной на каждую работу / роль, которую имеет пользователь, но вы запрашиваете только одну строку из результата (и вы также пропускаете проверку, если запрос возвращает хотя бы одну строку; в случае, если пользователь не существует, это создаст ошибку при выполнении mysqli_fetch_assoc($query) для пустого результата запроса).

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

Код:

  $isAdmin= FALSE;
  $isUser= FALSE;

  $query = mysqli_query($conn, 'SELECT staff.StaffID, role.Privilege FROM
    jobs
    INNER JOIN staff ON staff.StaffID = jobs.StaffID
    INNER JOIN role ON role.RoleID = jobs.RoleID
    WHERE login.Username = ?????????');


  while ($gettier = mysqli_fetch_assoc($query)) {
      if($gettier["Privilege"] === "Normal"){
        $_SESSION['userID'] = $row['LoginID'];
        $isUser= TRUE;
      }
      elseif($gettier["Privilege"] === "Admin"){
        $_SESSION['AdminID'] = $row['LoginID'];
        $isAdmin= TRUE;
      }
  }

  // redirect the user based on the $isAdmin/$isUser flag
  if ($isAdmin) {
    header("Location: staffindex.php?login=ADMINsuccess");
  } elseif ($isUser) {
    header("Location: staffindex.php?login=USERsuccess");
  } else {
    // User not found.
  }
...