Разрешение администратора и пользователя в PHP

Итак, я делаю свой собственный веб-сайт, а также я новичок в php-коде, я только начинаю с него. У меня проблема, как отключить пользователя с ролью «Пользователь» и не могу посещать страницы «Администратор» только с ролью «Администратор». посетите и используйте его. Каким будет мой PHP-код с этой проблемой? я видел какой-то код, но у меня действительно проблемы с его пониманием, потому что я просто новичок в PHP-коде.

вот мой код, который я использую в своей проблеме

сервер.php

if (mysqli_num_rows($results) == 1) { // user found
            // check if user is admin or user
            $logged_in_user = mysqli_fetch_assoc($results);
            if ($logged_in_user['user_type'] == 'admin') {

                $_SESSION['user'] = $logged_in_user;
                $_SESSION['success']  = "You are now logged in";
                header('location: admin/home.php');       
            }else{
                $_SESSION['user'] = $logged_in_user;
                $_SESSION['success']  = "You are now logged in";

                header('location: index.php');
            }

но роль пользователя по-прежнему может получить доступ к admin/home.php

также в admin/home.php у меня есть этот код

home.php

if (!isLoggedIn()) {
    $_SESSION['msg'] = "You must log in first";
    header('location: ../errors-404.html');
}

это функция isLoggedIn

function isLoggedIn()
{
    if (isset($_SESSION['user'])) {
        return true;
    }else{
        return false;
    }
}

php
person Mikee Ashklanov    schedule 22.04.2019    source источник
comment
оба типа пользователей являются логином, вам нужно проверить user_type (admin) и на основе этого разрешить или запретить доступ.   -  person Vidal    schedule 22.04.2019
comment
@ Видаль, у тебя есть какой-нибудь учебник для этого?   -  person Mikee Ashklanov    schedule 22.04.2019
comment
@MikeeAshklanov Я написал некоторую логику в своем ответе, дайте мне знать, если у вас все еще есть проблемы или вам нужны какие-либо объяснения.   -  person Danyal Sandeelo    schedule 22.04.2019


Ответы (3)


Вы можете добавить проверку типа пользователя в свою isLoggedIn()-функцию:

function isLoggedIn($type = null)
{
    if (!isset($_SESSION['user'])) {
        // We got no session at all. Not logged in.
        return false;
    }

    $currentType = $_SESSION['user']['user_type'] ?? null;

    if ($type && $type != $currentType) {
        // We got a type passed to the function, but the session type
        // doesn't match
        return false;
    }

    // Either we got no type or the type matched.
    return true;
}

Теперь вы можете использовать его для проверки, вошел ли пользователь вообще в систему (путем пропуска аргумента) или есть ли у пользователя определенная роль (путем передачи роли функции):

Чтобы проверить, вошел ли пользователь вообще:

// In the top of the page you want to protect
if (!isLoggedIn()) {
    // Not logged in at all
    header('location: foo.php');
    exit;
}

Чтобы проверить, вошел ли пользователь с определенной ролью:

// In the top of the page you want to protect
if (!isLoggedIn('admin')) {
    // Not logged in as an admin
    header('location: bar.php');
    exit;
}

person Magnus Eriksson    schedule 22.04.2019
comment
где я должен поставить isLoggedIn('admin') и isLoggedIn(); ? - person Mikee Ashklanov; 22.04.2019
comment
Если вам нужно только проверить, вошел ли пользователь в систему (независимо от роли), выполните: if (!isLoggedIn()) { ... } и если вам нужно проверить, есть ли у пользователя определенная роль, вы просто выполните: if (!isLoggedIn('admin')) { ... }. Я бы рекомендовал иметь это в верхней части страниц, которые вы хотите защитить. - person Magnus Eriksson; 22.04.2019
comment
Ух ты! это действительно работает, спасибо за помощь! как закрыть эту тему? - person Mikee Ashklanov; 22.04.2019

Потому что вы просто проверяете, установлен ли $_SESSION['user'] или нет, и он установлен в обоих случаях.

Проверьте это как:

function isAdmin()
{
  //this checks is user is logged in and type == "admin" 
 return (isset($_SESSION['user']) &&   isset($_SESSION['user_type']) && ($_SESSION['user_type']=="admin")  ); 

}

Концептуально должна быть еще одна функция, подобная этой

function validateLogin(){

   if(isLoggedIn()){
     if(isAdmin()){
       //redirect to admin page
      } 
      else{
              //redirect to user page
      } 
   }
   else{
      // invalid login
   } 
}

И в верхней части ваших файлов .php для администратора используйте ту же функцию, чтобы проверить, имеет ли пользователь доступ к этой конкретной странице или нет.

person Danyal Sandeelo    schedule 22.04.2019
comment
мне нужно поставить validatelogin на каждой странице администратора? - person Mikee Ashklanov; 22.04.2019
comment
определенно, вам нужно, чтобы эта функция isadmin вызывалась в первую очередь. вы не хотите, чтобы другие пользователи имели доступ к страницам администратора - person Danyal Sandeelo; 22.04.2019
comment
мне просто добавить функцию isadmin под моим isLoggedIn? - person Mikee Ashklanov; 22.04.2019
comment
я вижу что-то не так с моим вопросом, я переделываю его, мне очень жаль, я переделываю код в home.php - person Mikee Ashklanov; 22.04.2019

Вам необходимо изменить приведенную ниже функцию на странице администратора.

function isLoggedIn()
{
    if (isset($_SESSION['user']) && $_SESSION['user']['user_type'] == 'admin') {
        return true;
    }else{
        return false;
    }
}
person Rahul Singh    schedule 22.04.2019
comment
Можете ли вы добавить свою логику перенаправления на страницу ошибки в своем вопросе. - person Rahul Singh; 22.04.2019
comment
я вижу что-то не так с моим вопросом, я переделываю его, мне очень жаль, я переделываю код в home.php - person Mikee Ashklanov; 22.04.2019
comment
Могу ли я увидеть структуру массива вашего сеанса, используя функцию print_r в функции isLoggedIn. - person Rahul Singh; 22.04.2019