menu według uprawnień

0

Potrzebuję generować Menu w zależności od przyznanych uprawnień, nie wiem, czy są opracowania i gotowe rozwiązania na ten temat, ale wymyśliłem sobie takie o to rozwiązanie tego problemu. Proszę o uwagi i komentarze.

Na początek, uprawnienia usera są zapisane w tabeli jako true/false do danego modułu którym jest plik xxx.php.
PHP odczytuje tabelę wg loginu usera i tworząc strukturę menu sprawdza, czy dany moduł ma dostęp.

Tabela userów zawiera login i hasło
Tabela uprawnień zawiera login, nazwę pliku php, pole zezwolenia default=false
Tabela menu zawiera id_menu, id_parent[0 jeśli nie ma], odpowiadający plik php.
Skrypt działa tak:
Pobiera najpierw najwyższą strukturę menu czyli te które w id_parent zawierają 0 i sprawdza czy zalogowany user ma dostęp do niego przeszukując tabelę uprawnień.
Po tym przeszukuje kolejne zagłębienia menu wykonując to samo sprawdzenie uprawnień do danego pliku.

Nie za bardzo to pomieszane?
Może istnieje inne, leprze rozwiązanie?

0

No pomieszane, za dużo kolumn w bazie, niepotrzebne kombinacje.

0

Jakiś pomysł? Uwagi słuszne, ale co dalej?

0

Nie potrzebnie przypisujesz plik php do menu.
możesz nazwac plik według uprawnien, nawet jego czesc np. menu.$level_dostepu.php
Rozumiem, ze tabela userow zawiera poziom dostepu ?

Pozdro

0

Problem polega na tym, że nie mogę sztywno określić poziomów dostępu gdyż każdy user może mieć je bardzo różne, zależne od uprawnień, zajmowanego stanowiska i wymaganych na danym stanowisku koniecznych działań. Do tego te uprawnienia ma ustalać osoba będąca administratorem grupy do której należy dany user natomiast nie ma możliwości by user w tym systemie miał dostęp do więcej niż jednej grupy w tym administratorzy grup również, choć akurat tutaj dopuszczam możliwość wielu grup na jednego administratora.

Stąd taka komplikacja, czyli muszę mieć możliwość określenia indywidualnych uprawnienia dla grup w obszarze działania pojedynczych adminów oraz poziomów dostępu dla każdego usera indywidualnie. Oczywiście wstępnie będą ustalone uprawnienia default.

Stąd próbuję to w ten sposób rozwiązać.
Zrozumiałe to jest co napisałem?

0

No właśnie to takie rozwiązanie będzie idealne do tego...
Administrator określa level dostępu dla każdego usera przypisując mu odpiwiedni numer.
Reszte zrobi skrypt i instrukcja warukowa.

0

a może w bazie co do menu przechować URI? Sprawdzanie uprawnień chyba powinno być w jakimś dispatcherze.

0

Docelowo chcę do tego wszystkiego użyć LDAP. Teraz muszę jednak przemyśleć i przeanalizować wasze wypowiedzi, na pewno coś za chwilę napiszę na ten temat.

0

Tabela userow:
id nick pass level

Menu:
id parent name

Przy logowaniu przypisujesz level do stalej, masz gotowe pliki przygotowane dla roznych poziomow dostepu.

0

Nie może być tak jak napisałeś.
Admin grupy ma dostęp do wszystkich modułów i nimi zarządzania.
Teraz tak, dopisuje do grupy userów i przypisuje im grupę admina oraz uprawnienia wstępne.

Teraz tak, jeśli mam moduły w plikach php obsługujące poszczególne funkcje programu to muszę je przypisać indywidualnie do każdego z userów.

Zakładając, że w każdej grupie te uprawnienia mogą być różne a dostęp dotyczy tych samych modułów, to potrzebna będzie jednak tabela w której to będzie zapisane.
W tabeli więc zapisuję login identyfikujący usera i numer modułu do którego ma dostęp, jeśli nie ma wpisu to znaczy, że nie ma dostępu do danego modułu.
W tabeli modułów wpisuję identyfikatory modułów oraz nazwę pliku go zawierającego.

W ten sposób łatwo mogę określić, czy dany user ma dostęp do modułu, czy nie i na tej podstawie generować strukturę menu, z tym, że wcześniej w tabeli z zapisanym menu zebrać wszystkie możliwe poziomy menu z odpowiadającymi im identyfikatorami modułów z tabeli modułów oraz hierarchię w menu.

Tak już chyba będzie dobrze.
Jak sądzicie?

0

Nie może być tak jak napisałeś.

Może być bo działa to już gdzieś na serwerze...

 for($i=USER_LEVEL;$i>=0;$i--)
		{
			if(file_exists('cmd/'.$_GET['command'].'.'.$i.'.php'))
			{
				include('cmd/'.$_GET['command'].'.'.$i.'.php');
			}
		} 
0

Ja nie napisałem, że to nie zadziała tylko napisałem, że w tym przypadku to nie jest dobre rozwiązanie ponieważ muszę wtedy pisać dla każdego lewelu osobny plik php. A jak zaznaczyłem to właśnie między innymi tego chcę uniknąć gdyż ograniczy to możliwości konfiguracyjne systemu kontroli dostępu do aplikacji. Tak mi się wydaje.

0

@mag32: jeżeli dobrze rozumiem co próbujesz osiągnąć:

  1. Każdy użytkownik będzie należał do jakiejś grupy
  2. Każda grupa będzie miała przypisane jakieś uprawnienia do poszczególnych modułów
  3. Każdy użytkownik, oprócz uprawnień dziedziczonych z grupy, będzie mógł mieć przypisane uprawnienia specjalne (nadrzędne w stosunku do uprawnień dziedziczonych)

To próbowałbym robić tak jak napisałeś: oprócz tabeli przypisania user<->grupa, dodatkowo tabela user<->moduł. Tylko w takim wypadku może dojść do mało intuicyjnej sytuacji, gdzie użytkownik w grupie o wyższym poziomie security, będzie miał de facto uprawnienia mniejsze od innego z grupy o niższym poziomie security (przez uprawnienia specjalne).
Warto by się zastanowić czy nie da się uprawnień zrobić wyłącznie na grupach, może z relacją: użytkownik-grupa jak jeden do wielu.

0

@mag32: jeżeli dobrze rozumiem co próbujesz osiągnąć:

  1. Każdy użytkownik będzie należał do jakiejś grupy

TAK

  1. Każda grupa będzie miała przypisane jakieś uprawnienia do poszczególnych modułów
    Tak, ale do tych samych modułów i nie koniecznie takie same uprawnienia czyli zależne od grupy i humoru administratora tej grupy ;)
  1. Każdy użytkownik, oprócz uprawnień dziedziczonych z grupy, będzie mógł mieć przypisane uprawnienia specjalne (nadrzędne w stosunku do uprawnień dziedziczonych)

Tak, ale zarówno rozszerzone jak i ograniczone

To próbowałbym robić tak jak napisałeś: oprócz tabeli przypisania user<->grupa, dodatkowo tabela user<->moduł.
Tylko w takim wypadku może dojść do mało intuicyjnej sytuacji, gdzie użytkownik w grupie o wyższym poziomie security, będzie miał de facto uprawnienia mniejsze od innego z grupy o niższym poziomie security (przez uprawnienia specjalne).

No właśnie, a tak nie powinno być, muszę to jeszcze przemyśleć.

Warto by się zastanowić czy nie da się uprawnień zrobić wyłącznie na grupach, może z relacją: użytkownik-grupa jak jeden do wielu.

No widzisz, nie wiem, ponieważ tu jest pewne zasadnicze uwarunkowanie, a mianowicie, grupy nie mogą być od siebie zależne, a w każdym razie nie bezpośrednio. Bez zgody Admina grupy pozostałe grupy nawet nie powinny wiedzieć o jej istnieniu. To ważne w tym przypadku.

0
mag32 napisał(a)

Ja nie napisałem, że to nie zadziała tylko napisałem, że w tym przypadku to nie jest dobre rozwiązanie ponieważ muszę wtedy pisać dla każdego lewelu osobny plik php.

Właśnie nie musisz...
zauważ, że jak ktoś ma najwyższy level dostepu (rozumiem że będziesz używał dostępu hierarchicznego) Posiada także dostęp do levelów niższego szczebla.
Jest to oparte o szczegółowo dopracowaną architekturę, pozwalającą ustalić grupy i poziomy. Możesz także zrobić "wyłam" i ustawić uprawnienia "specjalne" dla poszczególnej grupy bądź użytkownika.
Przejrzyj dokładnie ten króciutki wycinek kodu i doceń jego banalność prostote a zarazem funkcjonalność.
Wydaje mi sie, że nie ma lepszego rozwiązania, jeżeli chodzi o ten typ autoryzacji.

Pozdro

0
root4 napisał(a)

Wydaje mi sie, że nie ma lepszego rozwiązania, jeżeli chodzi o ten typ autoryzacji.

Trzymanie wszystkiego w bazie danych i ACL do pojedynczych pozycji menu? :>

0
Demonical Monk napisał(a)
root4 napisał(a)

Wydaje mi sie, że nie ma lepszego rozwiązania, jeżeli chodzi o ten typ autoryzacji.

Trzymanie wszystkiego w bazie danych i ACL do pojedynczych pozycji menu? :>

Mówię o najprostszym i najskuteczniejszym z możliwych dostępnych rozwiązaniu, zresztą mimo że lubisz angażować wiele zabawek do php, ciekaw jestem jak ty byś rozwiązał sprawę, pamiętaj że LINUX to LINUX tutaj możesz sobie z poziomu php uruchomić każdy proces z var/www, czy jak sobie tam spatchowales, php na wiekszosci serwerow nie pozwala używania ini itp, to nie jest nawiązanie wyłącznie do tego tematu, ale i również do innych..

Pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1