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

Prosty system uprawnień w PHP

Object Storage Arubacloud
0 głosów
664 wizyt
pytanie zadane 25 października 2019 w PHP przez Dariusz Piechota Użytkownik (730 p.)
zmienione kategorie 25 października 2019 przez Comandeer

Cześć

Chciałem napisać z pozoru banalny system sprawdzania uprawnień i... utknąłem...

Ma to działać tak że mam 4 poziomy uprawnień do 4- najwyższy do 1- najniższy, podczas wywołania danej funkcji podaję wymagany poziom uprawnień self::uprawnienia(x); gdzie x to dany poziom, uprawnienie użytkownika przechowuję w sesji. To co mam działa na 2 razy a mianowicie nie zgadzają mi się komunikaty które ma otrzymać użytkownik przy próbie wykonania akcji do której nie ma dostępu. Proszę o jakąś podpowiedź jak to ugryźć, poniżej mój kod funkcji sprawdzającej dostęp usera.

public static function checkUserOnline()
	{
		if(!self::isLogged())
        {
			$_SESSION['message'] = "<center><div class='alert alert-danger' role='alert'>Nie masz uprawnień do korzystania z tej części serwisu.</br><strong>Proszę się najpierw zalogować!</strong></div></center>";
			self::redirect("../../logowanie-pracownik");
			die();
		}
	}


public function uprawnienia($wymagania)
{
	self::checkUserOnline();
	$rola = $_SESSION['uprawnienia'];
	    

	    switch ($rola) {
	        case 1: 
	            $arr = [1]; 
	            $msg = "<center><div class='alert alert-danger' role='alert'>Jako stażysta masz wyłączoną większą część uprawnień. Możesz jedynie przeglądać wizyty bez prawa dodawania oraz edycji.</br><strong>Tą akcję może wykonać jedynie Administrator systemu lub pracownik salonu.</strong></div></center>";
	            break;
	        case 2: 
	            $arr = [1, 2]; 
	            $msg = "<center><div class='alert alert-danger' role='alert'>Nie masz uprawnień Pracownika salonu do wykonania tej akcji.</br><strong>Tą akcję może wykonać jedynie Administrator systemu, Pracownik salonu lub Dział księgowości.</strong></div></center>";
	            break;
	        case 3: 
	            $arr = [1, 2, 3]; 
	            $msg = "<center><div class='alert alert-danger' role='alert'>Nie masz uprawnień do wykonania tej akcji.</br><strong>Tą akcję może wykonać jedynie Administrator systemu lub Pracownik salonu.</strong></div></center>";
	            break;
	        case 4: 
	            $arr = [1, 2, 3, 4]; 
	            $msg = "<center><div class='alert alert-danger' role='alert'>Nie masz uprawnień Administracyjnych do wykonania tej akcji.</div></center>";
	            break;
	        case 5: 
	            $arr = [1, 2, 3, 4, 5]; 
	            $msg = "<center><div class='alert alert-danger' role='alert'>Brak uprawnień.</div></center>";
	            break;
	        default: 
	            $arr = []; 
	            $msg = "<center><div class='alert alert-danger' role='alert'>Brak uprawnień</div></center>";
	            break;
	    }
	    
	    if (! in_array($wymagania, $arr)) {
	    	$_SESSION['uprawnienia_alert'] = $msg;
	        self::redirect("../../logowanie-pracownik");
	    }

 

2 odpowiedzi

0 głosów
odpowiedź 25 października 2019 przez Artek Stary wyjadacz (11,800 p.)

Przede wszystkim ten kod wydaje mi się przekombinowany. Nie rozumiem po co od razu przypisywać komunikat o błędzie skoro nie wiadomo jeszcze czy błąd się pojawił. U Ciebie jest tak, że nawet jeśli ktoś ma najwyższy poziom dostępu to i tak wiadomość o błędzie będzie przypisywana do zmiennej msg. Najpierw sprawdź czy rola jest wystarczająca do wymagań a potem ewentualnie generuj raport o błędzie.

Wywaliłbym też in_array i zamiast tego dał zwykły warunek if($rola < $wymagania)

Poza tym te liczby też bym wywalił i dał coś co lepiej opisuje typu np dla 5 "superadmin" dla 4 "admin" itp. Bardziej czytelne jest.

Wywal też element <center> jest przestarzały.

Nie czaję też tego kodu

self::redirect("../../logowanie-pracownik");
            die();

Skoro przekierowujesz go gdzieś to po co jest die() ? Jak rozumiem die() i tak się nie wykona w takim razie.

A na czym polega to , że nie zgadzają się komunikaty dla użytkowników o za niskich uprawnieniach dostępu? Nic się nie wyświetla, czy jak?

komentarz 25 października 2019 przez Ehlert Ekspert (212,670 p.)
Die w przypadku przekierowania jest oczywisty jeśli pisze się w taki sposób.
komentarz 25 października 2019 przez Artek Stary wyjadacz (11,800 p.)
Oczywisty w sensie, że dobrze napisał czy, że niepotrzebnie?
komentarz 25 października 2019 przez Ehlert Ekspert (212,670 p.)
Napisał dobrze.
komentarz 26 października 2019 przez Artek Stary wyjadacz (11,800 p.)
Czyli mówisz, że po przekierowaniu na inny adres skrypt dalej się będzie wykonywał?

To zawsze tak działa?
1
komentarz 26 października 2019 przez Ehlert Ekspert (212,670 p.)
Ale header(Location) nie robi redirecta bezpośrednio tylko dopisuje nagłówek do odpowiedzi.

Redirect jest dopiero jak przeglądarka go dostanie.

Jeśli nie masz żadnego frameworka który ogarnia Flow http req res, to warto zakończyć wykonywanie po takiej akcji.
komentarz 26 października 2019 przez Artek Stary wyjadacz (11,800 p.)
Dobrze wiedzieć, wydawało mi się, że jak przekieruje to od razu kończy wykonywanie. Odrobinę mądrzejszy jestem ;)
0 głosów
odpowiedź 26 października 2019 przez Ehlert Ekspert (212,670 p.)
  1. Nie oddzielasz logiki od widoku. Ten HTML w sesji to dramat. 
  2. Kod jest nieczytelny. Skąd ktoś kto nie znał Twoich zamiarów ma widzieć co to jest 5,4,3,2 itp? Tego typu oznaczenia umieszcza się w stałych z odpowiednimi nazwami.
  3. Pomysł z numerami jest kiepski. A co jeśli przyjdzie potrzeba zwiększyć granulację dostępu? Zrobisz rolę 2.5? Hierarchia też może się zmienić. Używaj stringów i postrzegaj rolę mieć albo nie mieć.

Podobne pytania

+1 głos
1 odpowiedź 911 wizyt
0 głosów
3 odpowiedzi 3,297 wizyt
0 głosów
1 odpowiedź 387 wizyt
pytanie zadane 14 lutego 2018 w PHP przez Bartess Gaduła (3,630 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...