Daniel Częstki

Daniel Częstki senior php developer

Temat: System uprawnień.

Witam. Szukam materiałów, źródeł na temat pisania systemów uprawnień.
Czy są książki które opisują jak budowac takie systemy ?

Temat: System uprawnień.

ale filozofia systemu uprawnień nie jest skomplikowana. Nie trzeba do tego książek :) Tak naprawdę najprostszy system możesz zbudować na zasadzie 2 pól w tabeli :P id użytkownika i poziom uprawnień gdzie będziesz trzymał dane np w takiej postaci:

1;2;3;1;1;2

a potem funkcją explode rozbijasz to na poszczególne elementy i w odpowiedniej części witryny/serwisu sprawdzasz jaka jest wartość na danym miejscu i zgodnie z wartością wykonujesz operacje

konto usunięte

Temat: System uprawnień.

Przede wszystkim, nie wiadomo, o jakie uprawnienia chodzi w tym temacie.
Czy mają to być uprawnienia do ściągania plików, oglądania contentu, czy czegokolwiek innego.
Zakładam jednak, że chodzi o uprawnienia użytkowników do danej podstrony serwisu.

@Dawid Pacholczyk: Twój pomysł jest dobry, ale koliduje z 2 postacią normalną i jest mało wydajny.

Trzeba podejść do problemu szerzej, i napisać coś bardziej elastycznego.

Proponuję (w dużym skrócie): dla każdego usera w tabeli bazy jedno pole określające zestaw przywilejowy (id).

- tabela z zestawami przywilejowymi dla użytkowników + panel administracyjny dla niej, gdzie można przypisać prawa dla danych plików, co i kto może oglądać.

Następnie odpowiednim użytkownikom przypisujemy żądane zestawy przywilejowe. W skryptach zamieszczamy na starcie jedną funkcję, która odczytuje zestaw przywilejowy użytkownika i na tej podstawie dokonuje wyboru pokaż/lub nie.

Ogólnie problem jest prosty, a ilość rozwiązań sięga liczb dwucyfrowych. Najprostszy sposób to jedno pole w bazie, np. 'user_status' i kilka prościutkich linijek na początku każdego pliku php. if status < 2 echo 'wypad'.Jakub Świegot edytował(a) ten post dnia 24.02.08 o godzinie 00:28
Jarosław Rafa

Jarosław Rafa senior software
engineer, Motorola
Solutions Systems
Polska

Temat: System uprawnień.

Mój sposób:
- kod każdego kawałka wymagajacego uprawnień (w skrajnym przypadku całej strony) strony ujęty w ifa:
if authenticate("jakis string") {
....
.... wlasciwy kod
....
} else {
....
.... cos tam w przypadku braku uprawnien
....
}
"jakis string" stanowi dowolną nazwę uprawnienia niezbednego, aby skorzystać z danej strony/opcji

- w tabeli z użytkownikami jest pole wyliczające po kolei uprawnienia danego usera:
string1,string2,...

Oczywiście funkcja authenticate() w jakiś sposób musi pobierać login uzytkownika, który jest aktualnie zalogowany do serwisu (np. z sesji, z HTTP-Auth itp.) i sprawdzac czy string podany jako argument funkcji wystepuje na liście uprawnien tego uzytkownika.

Jak do tej pory mi sie to sprawdza.

konto usunięte

Temat: System uprawnień.

Myślę, że Danielowi chodzi o coś zupełnie w innym wymiarze. Radziłbym skorzystać z literatury nie związanej bezpośrednio z jeżykami "internetowymi". Użytkownicy, grupy użytkowników, poziomy uprawnień na pewno nie są tak banalne jak opisali to poprzednicy, ale problemy z zarządzaniem użytkownikami istneiją od 30 (albo i dłużej) lat więc z pewnością coś na ten temat musiało zostac opublikowane :)
Daniel Częstki

Daniel Częstki senior php developer

Temat: System uprawnień.

Marcin Deręgowski:
Myślę, że Danielowi chodzi o coś zupełnie w innym wymiarze. Radziłbym skorzystać z literatury nie związanej bezpośrednio z jeżykami "internetowymi". Użytkownicy, grupy użytkowników, poziomy uprawnień na pewno nie są tak banalne jak opisali to poprzednicy, ale problemy z zarządzaniem użytkownikami istneiją od 30 (albo i dłużej) lat więc z pewnością coś na ten temat musiało zostac opublikowane :)

Masz racje.
Chodzi mi o cos bardziej skomplokowanego niz prosty if else. Mysle o zaprojektowaniu systemu uprawnien w nastepujacy sposob.
1. Istnieją różne wersje aplikacji (np. personal,standard,advanced) i każda z tych wersji oferuje inny zakres funkcjonalności.
2. Rozni uzytkownicy maja rozny poziom uprawnien do modułów i akcji przypisanych modułom

Zalózmy wersja STANDARD ma FUNKCJONALNOŚC B, ktorej nie ma wersja PERSONAL.
Np. Administartor wersji personal nie bedzie bedzie mial dostepu do funkcjonalności B, pomimo tego ze jest administratorem.

I teraz przyjmijmy ze mam system z okreslona funkcjonalnością.
Chcialbym oprócz 3 powyzszych wersji aplikacji stworzyć wersję demo dla kazdych z tych 3 wersji.
Uzytkownik DEMO logujac sie do aplikacji w wersji standard czy personal bedzie mial rozne funkcjonalnosci (narzucone przez wersje aplikacji) ale dodatkowo nie bedzie mogl np. zapisywac/usuwac danych.

Czy logika przydzielania osobnych poziomow uprawnien do uzytkownika jak i wersji aplikacji jest prawidlowa ?Daniel C. edytował(a) ten post dnia 24.02.08 o godzinie 10:46
Maciej M.

Maciej M. Advanced Software
Engineer

Temat: System uprawnień.

1. Istnieją różne wersje aplikacji (np. personal,standard,advanced) i każda z tych wersji oferuje inny zakres funkcjonalności.
2. Rozni uzytkownicy maja rozny poziom uprawnien do modułów i akcji przypisanych modułom

Zalózmy wersja STANDARD ma FUNKCJONALNOŚC B, ktorej nie ma wersja PERSONAL.
Np. Administartor wersji personal nie bedzie bedzie mial dostepu do funkcjonalności B, pomimo tego ze jest administratorem.

I teraz przyjmijmy ze mam system z okreslona funkcjonalnością.
Chcialbym oprócz 3 powyzszych wersji aplikacji stworzyć wersję demo dla kazdych z tych 3 wersji.
Uzytkownik DEMO logujac sie do aplikacji w wersji standard czy personal bedzie mial rozne funkcjonalnosci (narzucone przez wersje aplikacji) ale dodatkowo nie bedzie mogl np. zapisywac/usuwac danych.

Witam.

Najładniej moim zdaniem zrobić to na grupach tzn...

mamy moduły - moduły powinny mieć akcje
module_has_actions - przypisujemy do modułu akcje jakie można na nim wykonać to np przeglądanie, edycja, tworzenie nowego elementu, usuwanie, itd... ( np akcje z tabeli actions)
modules_has_groups - moduł należy do grupy (jest podobnie traktowany jak uzytkownik), zakladamy np grupe admin, i grupe moderator

grups_has_actions - dodajemy akcje jakie moze wykonać dana grupa
admin ma przypisane wszystkie dostepne akcje, moderator np tylko edycje i zapis

i oczywiście users_has_groups ,

i teraz cała zabawa.... jak dodamy dany moduł do grupy tylko admin, a nie dodamy do moderatora... -> po sprawdzeniu grup wiadomo ze user nalezacy do grupy moderator widzi tylko takie moduły ktore są w grupie moderator(logiczne?), nie zobaczy tych modułów ktore są w grupie admin,

jak juz mamy info o użytkowniku i info o module - sprawdzamy czy na module mozna wykonać konkretną akcje (np czy powinien mu sie pokazać przycisk "edit" czy tez nie )

jest to schemat ktory oczywiscie dopuszcza dopisywanie usera do wielu grup dzieki temu jest elastyczny, uprawnienia mogą się sumować,

W pewnym swoim projekcie rozwiązuję to tak ze mam pewien fragment kodu w jednej z metod, ktora jest uruchamiana przez kontroler, w tej metodzie sprawdzam czy akcja którą chcę wykonać na module jest jedną z metod w klasie modułu, sprawdzam oczywiscie grupę usera i tego modułu i wyświetlam stosowne komunikaty lub wykonuję daną metodę/akcję.
Myślę że rozwiazuje to prawie wszystkie problemy związane z uprawnieniami.

(wiem może i wygląda to skomplikowanie ale sugeruję wziąć sobie DBDesignera i ropisac tabele a po chwili sami się zaskoczycie że to naprawdę fajnie działa)

Pozdrawiam
Łukasz Ważny

Łukasz Ważny winning doesn't
really matter as
long as you win

Temat: System uprawnień.

W Zend Framework i Zend_Acl i Zend_Auth możesz sobie ustalić listę zasobów, listę ról i na podstawie ustalonych zezwoleń badać czy dana rola ma dostęp do danych zasobów.

Możesz ustalić sobie dziedziczenie ról i dziedziczenie zasobów, a przez to dziedziczenie uprawnien, klasy praktycznie nie są zintegrowane z mechanizmem MVC w ZF i łatwo je odpiąć. Właściwie jeśli chcemy wykorzystać je w ZF to trzeba je podpiąć.

Samo Zend_Acl + Zend_Auth opiera się o przyznawanie zasobom dostępu do akcji, w praktyce znaczy to że zasób to jest identyfikator moduł/kontroler, a akcja to może być akcja z dowolnego kontrolera. Dodajesz do tego alow/deny i sprawdzasz w odpowiednim momencie.

Dokumentacji jest trochę do poczytania i przykłady też są, trochę trzeba pomyśleć i poprogramować, więc sam ZF nie odbiera radości z tworzenia oprogramowania :).

W przypadku opisanym przez Ciebie mógłbyś utworzyć odpowiednie drzewa zasobów i role i poprzypisywać do nich odpowiednie uprawnienia, lub je pozabierać odpowiednie (zapis/kasowanie).

Wg mnie najlepiej zarządzanie uprawnieniami oprzeć o role i o zasoby i do par rola-zasób przydzielać uprawnienia, podobne rozwiązania są zastosowane w drupalu, w zendzie i w wielu systemach pewnie lepiej to nie jest rozwiązane.Łukasz Ważny edytował(a) ten post dnia 24.02.08 o godzinie 19:16
Nikodem Ośmiałowski

Nikodem Ośmiałowski Programista,
freelancer, backend
& frontend developer

Temat: System uprawnień.

Fajnie, ale wiele z tych rozwiązań jest dość ciężkich. Ja preferuję użycie masek bitowych. Każdemu uprawnieniu (np. newsy, artykuły, galerie) nadajemy jakiś numer, np.:

<?php
$uprawnienia = array();
$uprawnienia['news'] = 1;
$uprawnienia['artykuly'] = $uprawnienia['news'] << 1;
$uprawnienia['galerie'] = $uprawnienia['news'] << 2;
?>

W ten sposób każda zmienna to pewna liczba. Chcąc teraz nadać użytkownikowi uprawnienia do newsów i galerii, robimy coś takiego:

<?php
$uprawnienia_uzytkownika = $uprawnienia['news'] | $uprawnienia['galerie'];
?>

Zmienna $uprawnienia_uzytkownika to liczba, którą zapisujemy w bazie danych przy użytkownikowu. Aby sprawdzić czy user ma prawa do galerii robimy coś takiego:

<?php
if ($uprawnienia['galerie'] == ($uprawnienia_uzytkownika & $uprawnienia['galerie']))
 echo 'Masz uprawnienia';
else
 echo 'Nie masz uprawnień';
?>

Ja napisałem sobie do tego klasę składającą się z konstruktora i trzech metod i stosuję ją w następujący sposób:

<?php
$permissions->set(array('news', 'galerie'));
$permissions->get('galerie', $uprawnienia_uzytkownika);
?>

Pozdrawiam,
NikodemNikodem Ośmiałowski edytował(a) ten post dnia 25.02.08 o godzinie 09:49
Michał Pawłowski

Michał Pawłowski Software Development
Engineer

Temat: System uprawnień.

hm... no to może podzielę się moim pomysł który aktualnie koduję...
pokrywa się z wizją Maćka Marszałka... mianowicie:

każdy moduł/strona ma przypisany poziom wymaganych praw 1,2,3 itd
a każdy user ma poziom dostępu :) tym samym ma dostęp do opcji o mniejszym lub tym samym poziomie

ponadto każdy moduł ma akcje które można wł/wył. + ew. można do każdej akcji dodatkowo dodać wymagany poziom dostępu...

to załatwia sprawę od strony ogólnej ...

pozostaje tylko zarządzanie wyjątkami , najprościej = tabela zawierająca id usera, id modułu i prawa do akcji danego modułu :) ...

oczywiście po drodze można bezproblemowo zdefiniować i przypisać userom grupy użytkowników, to będzie tylko rozszerzenie zarządzania wyjątkami :) ...

pozdr
Daniel Częstki

Daniel Częstki senior php developer

Temat: System uprawnień.

Mi osobiście filozofia zaprezentowana przez Maćka podoba się najbardziej.

konto usunięte

Temat: System uprawnień.

Ja chyba przypisywał bym po prostu odpowiednie interfejsy do klas dla użytkowników w zależności od ich statusu (użytkowników).Rafał Dudziński edytował(a) ten post dnia 25.02.08 o godzinie 21:21
Paweł Grzegorczyk

Paweł Grzegorczyk programista i
współwłaściciel
Nauko.pl

Temat: System uprawnień.

Witam.

Ja też podziele się swoim rozwiązaniem.

U mnie problem byl taki, że każdy użytkownik mógł mieć różne role (a zatem i prawa) w różnych projektach.

Tak więc do każdej czynności którą można w aplikacji wykonać (czynności związane z uzytkownikami /dodanie/edycja/usuniecie/podglad/ , projektami , taskami, obrazkami, skryptami, lekcjami, contentami i wiele wiele innych) dodalem osobne prawo (praw w chwili obecnej jest kilkadziesiat).

Glowny administrator aplikacji ma prawo w panelu definiowac ROLE i przypisywac im prawa. Kazde prawo moze byc przypisane na poziomie R lub RW (lub wogole).

Zakladając uzytkownika - administrator przypisuje go do odpowiedniej roli. Rola moze byc globalna (np. administrator globalny - czyli ma prawa ROLI Admin dla wszystkich projektow) lub moze byc lokalna na poziomie wybranego projektu (tablica userId, roleId, projectId)

Przy kazdym logowaniu zczytywane są wszystkie role uzytkownika i wszystkie prawa zwiazane z tymi rolami w roznych projektach i zapisane wraz z obiektem uzytkownika w sesji.

Dziala szybko ale przede wszystkim jest elastyczne.
Rozwijając aplikacje - dodaje po prostu kolejne PRAWA ktore pojawiaja sie w panelu administratora. On te prawa dopisuje do odpowiednich rol i w ten sposob wszyscy np Admini maja dostep do nowej funkcjonalnosci.
Daniel Częstki

Daniel Częstki senior php developer

Temat: System uprawnień.

hmm.
zalozmy mamy zdefiniowana role 'guest', ktora definiuje dostep (badz nie) do modulów, które nie wymagaja zalogowania.
Dodajemy jakiegos uzytkownika, ktory ma np. 2 dodatkowe role helpdesk i news.
rola guest nie pozwala na dostep do helpdesku i news
rola helpdesk pozwala na dostep do helpdesku, ale wycina dostep do news
rola news pozwala na dostep do news, ale wycina dostep do helpdesku

jak uchronic sie przed takim zakleszczeniem uprawnien tudziez zdefiniowaniem rol, ktorych uprawnienia wzajemnie sie znosza ?

Mi chodzi po głowie jakas hierarchia waznosci ról, ale moze da sie to zrobic inaczej ?
Moze zrobic tak, ze ze wszystkich rol zbieram zasoby, do ktorych jest wlaczony dostep i tworze 1 ogolna tablice dostepu.Daniel Częstki edytował(a) ten post dnia 09.07.09 o godzinie 11:25

konto usunięte

Temat: System uprawnień.

Zobacz jak dziala kontrola dostepu w systemach linuxowych, i zrob tak samo.

Ja korzystam z podobnej implementacji zbudowanej na bazie Zend_Acl,

Następna dyskusja:

system uprawnień - koncepcja




Wyślij zaproszenie do