Попытка проверить роли пользователя в панели управления - PullRequest
0 голосов
/ 14 января 2019

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

Логин работает отлично, но проверка роли пользователя не так уж и много.

На сайте есть одна панель управления для каждой роли, и в верхней части каждой это:

session_start(); 
if(!$_SESSION['sess_role'] == 'role1') {
    header('location:../../index.php');
}

Кажется, что это работает, когда вы не вошли в систему, отправив вас обратно на страницу индекса правильно, потому что атрибут 'sess_role' не совпадает, но как только я войду в систему с ЛЮБЫМ пользователем, я смогу ввести КАЖДУЮ отдельную панель мониторинга путем ввода URL-адреса вручную, несмотря на отсутствие правильной «роли» для него.

Вот код для входа:

$msg = ""; 
if(isset($_POST['submitBtnLogin'])) {
    $username = trim($_POST['username']);
    $password = trim($_POST['password']);
    if($username != "" && $password != "") {
        try {
            $query = "select * from `users` where `username`=:username and `password`=:password";
            $stmt = $db->prepare($query);
            $stmt->bindParam('username', $username, PDO::PARAM_STR);
            $stmt->bindValue('password', $password, PDO::PARAM_STR);
            $stmt->execute();
            $count = $stmt->rowCount();
            $row   = $stmt->fetch(PDO::FETCH_ASSOC);
            if($count == 1 && !empty($row)) {

                $_SESSION['sess_user_id']   = $row['id'];
                $_SESSION['sess_username'] = $row['username'];
                $_SESSION['sess_role'] = $row['role'];
            }

                if($row['role'] == "role1") {
                header('location:modules/role1/index.php');
                } else if($row['role'] == "role2") {
                header('location:modules/role2/index.php');
                } else if($row['role'] == "role3") {
                header('location:modules/role3/index.php');
                } else if($row['role'] == "role4") {
                header('location:modules/role4/index.php');

            } else {
                $msg = "Invalid login information.";
            }
        } catch (PDOException $e) {
            echo "Error : ".$e->getMessage();
        }
    } else {
        $msg = "Both fields are required.";
    }
}

Я пытался сделать:

echo($_SESSION['sess_role']);

Чтобы увидеть, что вывод, и он, кажется, работает как задумано, показывая «роль1», когда я нахожусь на учетной записи «роль1», и то же самое для других ролей.

Например, при доступе к приборной панели "role2" выводом остается "role1", но я все еще могу войти.

Я был бы очень признателен за помощь в определении проблемы.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Как выяснилось и согласно комментарию, который я оставил , был причиной сбоя:

Вы должны добавить выход; после каждого заголовка. Ваш код, вероятно, хочет продолжить выполнение.

Рекомендуется использовать заголовок с exit, в соответствии со следующими вопросами и ответами здесь при переполнении стека:

На добавленной заметке; не храните простые текстовые пароли. Сохраните хешированную версию, используя password_hash():

И затем проверить их с помощью password_verify():

Пожалуйста, прочитайте их полностью, это важно.

Использование только подготовленного утверждения недостаточно безопасно, особенно когда речь идет о паролях.

0 голосов
/ 14 января 2019

Оператор ! привязывается к $_SESSION['sess_role'], а не ко всему выражению. Вы должны поместить свое выражение в скобки if(!($_SESSION['sess_role'] == 'role2')) или лучше использовать оператор неравных для лучшей читаемости if($_SESSION['sess_role'] != 'role2') {

...