PHP — проблема с разрешениями с использованием сеанса

#php

#php

Вопрос:

Прежде всего, я совершенно новичок в этом, так что будьте терпеливы.

Итак, в моей базе данных есть разные роли, такие как admin и saf , и если пользователь, вошедший в систему, является администратором, я хочу, чтобы они видели все, но если пользователь, вошедший в систему, является saf, я просто хочу, чтобы они видели Dashboard и. SAF

Если вам нужен какой-либо другой код, я могу его предоставить, но я думаю, этого достаточно??

База данных

 <?php 
session_start(); 

$ligaBD=mysqli_connect("localhost","root","","pap"); 

if (!isset($_SESSION['loggedin'])) { 
    header('Location: login.html'); 
    exit(); 
} 

if (!isset($_SESSION['role']) || ($_SESSION['role'] != 'admin')) { 

?>
<ul class="nav navbar-nav">
    <li class="active"><a href="admin.php">Dashboard</a></li>

    <li><a href="biblioteca.php">Biblioteca</a></li>
    <li><a href="conselhoadmin.php">Conselho Administrativo</a></li>
    <li><a href="saf.php">SAF</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
    <li><a href="#">Bem-vindo, admin <?=$_SESSION['name']?></a></li>
    <li>
        <a href="https:a"><img src="./images/mail.png" alt="la" height="13" width="20" /></a>
    </li>
    <li><a href="./logout.php">Logout</a></li>
</ul>

<?php

}else if (!isset($_SESSION['role']) || ($_SESSION['role'] != 'saf')) {
?>

    <ul class="nav navbar-nav">
        <li class="active"><a href="admin.php">Dashboard</a></li>
        <li><a href="saf.php">SAF</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-right">
        <li><a href="#">Bem-vindo, saf @login</a></li>
        <li>
            <a href="https:a/"><img src="./images/mail.png" alt="la" height="13" width="20" /></a>
        </li>
        <li><a href="./login.html">Logout</a></li>
    </ul>

<?php
    mysqli_close($ligaBD);
?>
 

Что происходит со мной с этим кодом, так это то, что когда я вхожу в систему как пользователь SAF, я все равно вижу функции администратора.

Я был бы очень признателен, если бы вы могли мне помочь. Спасибо

Ответ №1:

Вы путаете if условия.

Первое if условие должно быть:

 if (isset($_SESSION['role']) amp;amp; ($_SESSION['role'] == 'admin')) {
 // Show admin role links.
 

И второе if условие должно быть:

 if (isset($_SESSION['role']) amp;amp; ($_SESSION['role'] != 'admin')) { 
 // Show admin Non-admin/saf role links.
 

Комментарии:

1. Привет, спасибо за ответ! Я пытался сделать то, что ты сказал, но теперь там написано prntscr.com/ndm5bw это еще одна роль prntscr.com/ndm5vf

2. Пожалуйста, объясните, почему эти изменения должны быть внесены, Ученик?

Ответ №2:

Вам нужно привести в порядок свои if заявления. Многие из них проверяют два условия, когда на самом деле нужно проверить только одно.

Кроме того, вы могли бы заменить свои if утверждения switch утверждениями, если вариантов становится много.

Приведенный ниже упрощенный код покажет $_SESSION данные администратора для переменной, помеченной как admin, и данные SAF для переменной, помеченной как SAF.

Также используйте инструмент строгого сравнения === в качестве наилучшей практики. Проверьте наличие положительных совпадений, а не отрицательных совпадений (ищите === нет !== ).

Пожалуйста, обратите внимание, что список аргументов находится в порядке, отличном от вашего исходного кода.

 /***
 * I would suggest using the below line to avoid error report NOTICES.
 * Setting an unset value to false also fits the later test of empty()
 ***/
if(!isset($_SESSION['role'])){
    $_SESSION['role'] = false;
}


if ($_SESSION['role'] === 'admin') { 

?>
Admin Dashboard HTML

<?php

}
elseif ($_SESSION['role'] === 'saf'){
?>

     SAF Dashboard HTML

<?php
}
elseif (!empty($_SESSION['role']) ) {
 ?>
   Some other authentication level dashboard (optional). 
<?php
}
 mysqli_close($ligaBD);
?>
 

Комментарии:

1. Спасибо за ответ! Я внес изменения, которые вы предложили, и я получил эту ошибку: Уведомление: неопределенный индекс: роль

2. @Pedro ну, тебе нужно установить значение role . Если вы хотите role , чтобы он не был установлен, вы можете просто игнорировать эти notice предупреждения об уровне.

3. Обновлено, и теперь оно ничего не показывает:/ prnt.sc/ndrjfh Вот как это должно быть: prntscr.com/ndrkk9

4. @Pedro Там была опечатка, которую я сейчас исправил. Вы должны были получить уведомление об этом. Пожалуйста, повторите попытку с новым кодом, приведенным выше. Спасибо.

5. Доброе утро, извините за поздний ответ. Я протестировал его, и он по-прежнему ничего не показывает, однако я попытался сменить «роль» на «имя», а вместо «администратор» я написал «pedro@gmail.com ‘это имя пользователя, связанное с ролью администратора. Итак, проблема в «роли». Спасибо

Ответ №3:

Если вы хотите показать панель мониторинга и saf всем пользователям, вы можете использовать условие if, как показано ниже:

 if (isset($_SESSION['role']) amp;amp; ($_SESSION['role'] != 'admin')) {
     // Show Dashboard and saf and other links to all users.
     <ul class="nav navbar-nav">
        <li class="active"><a href="admin.php">Dashboard</a></li>
        <li><a href="saf.php">SAF</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-right">
        <li><a href="#">Bem-vindo, saf @login</a></li>
        <li>
            <a href="https:a/"><img src="./images/mail.png" alt="la" height="13" width="20" /></a>
        </li>
        <li><a href="./login.html">Logout</a></li>
    </ul>

}else{
    // Show All links admin users.
    <ul class="nav navbar-nav">
        <li class="active"><a href="admin.php">Dashboard</a></li>
        <li><a href="biblioteca.php">Biblioteca</a></li>
        <li><a href="conselhoadmin.php">Conselho Administrativo</a></li>
        <li><a href="saf.php">SAF</a></li>
    </ul>
    <ul class="nav navbar-nav navbar-right">
       <li><a href="#">Bem-vindo, admin <?=$_SESSION['name']?></a></li>
       <li>
           <a href="https:a"><img src="./images/mail.png" alt="la" height="13" width="20" /></a>
       </li>
       <li><a href="./logout.php">Logout</a></li>
    </ul>

}