• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Elementy według roli

Object Storage Arubacloud
+1 głos
131 wizyt
pytanie zadane 20 lutego 2022 w PHP przez jxk Nowicjusz (210 p.)
edycja 20 lutego 2022 przez jxk

Cześć, chciałbym zrobić na stronie system który ustawia uprawnienia według roli którą pobiera z bazy danych.

Przykładowo:
Prezes widzi wszystkie elementy w nawigacji natomiast pracownik widzi tylko Stronę główną i Zgłoszenia.

Chciałbym żeby ktoś mnie lekko nakierował jak to zrobić.

 

Wpadłem na takie coś ale wydaje mi się że można napisać to krócej.

$rola = $_SESSION['role'];
                switch($rola){
                    case "Prezes":
                        echo "<a href='/panel' class='nav-a'>Strona główna</a>";
                        echo "<a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>";
                        echo "<a href='/' class='nav-a'>Magazyn</a>";
                        echo "<a href='/' class='nav-a'>Klienci</a>";
                        echo "<a href='/' class='nav-a'>Faktury</a>";
                        echo "<a href='/' class='nav-a'>Archiwum</a>";
                        echo "<a href='/zmiany' class='nav-a'>Zmiany</a>";
                        break;
                    case "Informatyk":
                            echo "<a href='/panel' class='nav-a'>Strona główna</a>";
                            echo "<a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>";
                            echo "<a href='/' class='nav-a'>Magazyn</a>";
                            break;
                    default:
                        echo "<a href='/panel' class='nav-a'>Strona główna</a>";
                        echo "<a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>";
                        echo "<a href='/' class='nav-a'>Magazyn</a>";
                        echo "<a href='/' class='nav-a'>Faktury</a>";
                        echo "<a href='/' class='nav-a'>Archiwum</a>";
                        echo "<a href='/zmiany' class='nav-a'>Zmiany</a>";
                        break;
                }

 

3 odpowiedzi

+2 głosów
odpowiedź 20 lutego 2022 przez rafal.budzis Szeryf (85,260 p.)
edycja 20 lutego 2022 przez rafal.budzis

Mapy klucz wartość plus rozdzielenie logiki od szablonu to to co potrzebujesz ;) 

Zacznijmy od mapy

$mapRoleToNavigation = [
    'Prezes' => [
        [
            'href' => '/panel',
            'name' => 'Strona główna'
        ],
        [
            'href' => '/prezes',
            'name' => 'Zakładka prezesa'
        ]
    ],
    'Informatyk' => [
        [
            'href' => '/panel',
            'name' => 'Strona główna'
        ]
    ]
];

Potem robiisz sobie funkcje do pobierania danych 
 

function getNavLinks() {
    return $mapRoleToNavigation[$_SESSION['role']] ?? [];
}

Następnie zostaje OSOBNY PLIK szablonu coś w ten deseń ;) 

 

<?php
     $navigationLinks = getNavLinks();
?>

<nav>
    <? foreach ($navigationLinks as  $value) : ?>
        <a href="<?= $value['href'] ?>" class="nav-a">
            <?= $value['name'] ?>
        </a>
    <? endforeach ?>
</nav>

Oddzielaj logike od szablonu! :) Poczytaj o MVC.

+1 głos
odpowiedź 20 lutego 2022 przez SzkolnyAdmin Szeryf (86,400 p.)

Trop jest dobry - ładujesz elementy w zależności od uprawnień. Jak to skrócić? Możesz np. przygotować w oddzielnych plikach PHP kod interfejsu dla danego usera i ładować go przy pomocy poleceń include/require.

switch($rola){
      case "Prezes":
          require_once "prezes.php";
          break;
      case "Informatyk":
         require_once "informatyk.php";
         break;
      default:
         require_once "default.php";
 }

Nie zmieni to co prawda globalnej objętości kodu (a nawet ja zwiększy), ale będzie przejrzyściej i łatwiej w razie dokonywania zmian. Rozwinięciem twojego pomysłu jest system szablonów.

Przeczytaj jeszcze ten wątek.

1
komentarz 20 lutego 2022 przez rafal.budzis Szeryf (85,260 p.)

Mapy twoim przyjacielem ;) Twój kod też można by zmniejszyć używając mapowania ;) 
 

$mapRoleToTemplate = [
    "Prezes": "prezes.php",
    "Informatyk": "informatyk.php",
];

require_once $mapRoleToTemplate[$rola] ?? "default.php";

 

0 głosów
odpowiedź 20 lutego 2022 przez VBService Ekspert (253,420 p.)
edycja 21 lutego 2022 przez VBService

Jeżeli to będzie "nierozbudowane" menu z "niewielką" ilością ról, to może wystarczy taki a'la template

 

index.php  (dla demonstracji logowania)

<?php
  session_start();

  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // Tu sprawdzenie login-a i hasła z bazy danych
    // dla demonstracji poniżej symulacja zalogowania
    $users = ['default', 'prezes', 'informatyk'];
    if (in_array($_POST['login'], $users, true)) {
      $_SESSION['role'] = $_POST['login'];
      header('Location: menu.php');
      exit();
    }
  } else {
    unset($_SESSION);
    session_destroy();
  }
?>
<style>
  form {
    margin: 2em;
  }
  input, button {
    display: block;
    margin: 1em 0;
    width: 16em;
  }
</style>
<form action="" method="post">
  <input type="text" id="login" name="login" placeholder="login" readonly />
  <input type="password" id="password" name="password" placeholder="password" readonly />

  <button type="submit" id="default">Zaloguj jako user ( default )</button>
  <button type="submit" id="prezes">Zaloguj jako Prezes</button>
  <button type="submit" id="informatyk">Zaloguj jako Informatyk</button>
</form>
<script>
  const form = document.querySelector('form');
  form.addEventListener('click', loginAs);

  function loginAs(e) {
    if (e.target.nodeName == 'BUTTON') {
      form.querySelector('input#login').value = e.target.id;
      form.querySelector('input#password').value = '1234';
    } else {
      e.preventDefault();
    }    
  }
</script>

 

menu.php  (dla demonstracji)

<?php
  session_start();

  $logged_as = ''; // dla demonstracji
  $allow_for_menu = null;

  if (isset($_COOKIE['PHPSESSID']) && isset($_SESSION['role'])) {
    $logged_as = $_SESSION['role']; //  dla demonstracji
    $allow_for_menu = $_SESSION['role'];
  } else {
    header('Location: index.php');
    exit();
  }
?>
<!DOCTYPE html>
<html lang="pl">
  <head>
    <meta charset="utf-8" />

    <style>
      div, nav {
        margin: 1em;
      }
      .show-role span {
        font-weight: bold;
      }
      nav a {
        display: block;
        text-decoration: none;
        margin: 0.35em 0;
        font: 400 1em/1.1 arial;
      }
      nav a:hover {
        text-decoration: underline;
      }
      nav a:last-child {
        margin: 1em 0 0 0;
      }
    </style>
  </head>
  <body>
    <!-- dla demonstracji -->
    <div class="show-role">Zalogowany: <span><?php echo $logged_as; ?></span></div>

    <nav>
      <!-- 
           default = niezalogowany w tym przykładzie,
           to widzą wszyscy niezależnie od roli
      -->
      <a href='/panel' class='nav-a'>Strona główna</a>
      <a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>
      <a href='/' class='nav-a'>Magazyn</a>
      <a href='/' class='nav-a'>Faktury</a>
      
      <!-- prezes zobaczy to co default plus to co może prezes -->
    <?php if ($allow_for_menu == 'prezes'): ?>
      <a href='/' class='nav-a'>Archiwum</a>
      <a href='/zmiany' class='nav-a'>Zmiany</a>
    <?php endif; ?>


      <!-- informatyk zobaczy to co default plus to co może informatyk -->
    <?php if ($allow_for_menu == 'informatyk'): ?>
      <a href='/' class='nav-a'>Ustawienia</a>
      <a href='/zmiany' class='nav-a'>Baza danych panel</a>
    <?php endif; ?>

      <!-- 
           default = niezalogowany w tym przykładzie,
           to widzą wszyscy niezależnie od roli
      -->
      <a href="index.php">Wyloguj</a>
    </nav>

  </body>
</html>

 

menu.php  (wersja robocza)

<?php
  session_start();
  $allow_for_menu = null;

  if (isset($_COOKIE['PHPSESSID']) && isset($_SESSION['role'])) {
    $allow_for_menu = $_SESSION['role'];
  } else {
    header('Location: index.php');
    exit();
  }
?>
    <!--
      style ewentualnie też do usunięcia, w dokumencie głównym można podlikować
    -->
    <style>
      nav {
        margin: 1em;
      }
      nav a {
        display: block;
        text-decoration: none;
        margin: 0.35em 0;
        font: 400 1em/1.1 arial;
      }
      nav a:hover {
        text-decoration: underline;
      }
      nav a:last-child {
        margin: 1em 0 0 0;
      }
    </style>

    <nav>
      <a href='/panel' class='nav-a'>Strona główna</a>
      <a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>
      <a href='/' class='nav-a'>Magazyn</a>
      <a href='/' class='nav-a'>Faktury</a>
      
    <?php if ($allow_for_menu == 'prezes'): ?>
      <a href='/' class='nav-a'>Archiwum</a>
      <a href='/zmiany' class='nav-a'>Zmiany</a>
    <?php endif; ?>

    <?php if ($allow_for_menu == 'informatyk'): ?>
      <a href='/' class='nav-a'>Ustawienia</a>
      <a href='/zmiany' class='nav-a'>Baza danych panel</a>
    <?php endif; ?>

      <a href="index.php">Wyloguj</a>
    </nav>

 

Jeżeli menu ma być "rozbudowane" z dużą ilością ról, to polecałbym rozwiązanie, które podał @rafal.budzis;

Podobne pytania

+1 głos
1 odpowiedź 283 wizyt
pytanie zadane 21 kwietnia 2019 w PHP przez hiper007 Stary wyjadacz (11,270 p.)
0 głosów
1 odpowiedź 543 wizyt
0 głosów
1 odpowiedź 234 wizyt
pytanie zadane 24 stycznia 2022 w Hostingi, domeny, usługi przez Mocaz Użytkownik (560 p.)

92,579 zapytań

141,432 odpowiedzi

319,660 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...