Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Uprawnienia, kontrola dostępu
Forum PHP.pl > Forum > PHP > Frameworki
sonicpb
Witam,

tworzę aplikację do rejestrowania błędów podczas testowania jakiegoś serwisu, mam wielu użytkowników, natomiast tylko dwie role, jedną administrator - wiadomo może wszystko i drugą user - zwykły użytkownik, który może w zależności od uprawnień dodawać i edytować zgłoszenia.
struktura tabeli uprawnienia:


wygląd okna z zapisem uprawnień:


mam też jakąś listę klientów i jakaś liste produktów

i teraz sprawa wygląda następująco:
przykładowo użytkownik o ID #26 ma 3 uprawnienia zapisane w bazie danych
pierwsze jest to uprawnienie REJESTRACJI w obrębie klienta o ID #22(komórka produkt_id null) znaczy to, że ten użytkownik może rejestrować nowe zgłoszenia tylko dla tego jednego klienta, ale dla wszystkich jego produktow, czyli jest klient ABECADLO i ma produkty A,B,C,D to może rejestrować nowe zgłoszenia dla wszystkich produktów czyli A,B,C,D

drugie urpawnienie ZARZĄDZANIA jest już w obrębie konrektnego produktu(komórki klient_id i produkt_id mają wartości) znaczy to, że ten użytkownik, może edytować zgłoszenia ale TYLKO dla tego konkretnego klienta i tego konkretnego produktu, nie może zarządzać żadnymi innymi zgłoszeniami, tylko tymi.

trzecie uprawnienie PRZEGLĄDANIA, tyczy się tego samego klienta co wyżej tylko innego produktu, także ten użytkownik może TYLKO przeglądać wszystkie zgłoszenia dla tego jednego konkretnego produktu.

wyżej mamy jeszcze tzw. uprawnienia globalne. znaczą one tyle, że jeżeli mamy zaznaczone rejestrowanie globalne, to użytkownik może rejestrować dowolne zgłoszenia, dla każdego klienta i dla każdego produktu.

moje pytanie brzmi, czy jest ktoś w stanie pomóc mi zaimplementować tę strukturę w Zend ACL, gdyż jestem początkujący w zend, a nigdy wcześniej nie robiłem uprawnień tego typu.

w razie pytań pisać smile.gif
Dzięki wielkie
CzarnyGsm
Z pluginem ACL dość duży kombinacji by Ci wyszło. W zależności od tego ile masz tych opcji, które posiada zwykły użytkownik musiałbyś stworzyć tyle samo ról. Przy 4 opcjach jest to aż 4! (24 rang). Do tego męczyć się z dodawaniem odpowiednich akcji do metody allow(), deny().
Moim zdaniem byłoby to nieefektywne, dlatego według mnie lepszym sposobem jest pobieranie danych z tabeli "uprawnienia" za każdym razem.
Niech inni użytkownicy na ten temat się wypowiedzą bo mogę się mylić.

Pozdrawiam
Pilsener
Model ACL przyda się jeśli bazujemy na rolach i dziedziczeniu a nie relacji wiele do wielu, czyli gdy nieskończonej liczbie userów możemy przyznać nieskończoną liczbę zasobów.

Tabelę z uprawnieniami dołączasz do users i po prostu wrzucasz to do sesji, potem i tak musisz to w kontrolerach/widokach okodować, czyli namnożyć ifów.

ACL by się przydał gdybyś chciał uprawnienia pogrupować, np. masz kilkaset zasobów i ich ustawianie za każdym razem każdemu jest męczące, wtedy tworzysz role typu "pracownik działu AGD" (ma dostęp do kilkunastu specyficznych zasobów), "menedżer działu AGD" (dziedziczy uprawnienia po pracowniku i dostaje jeszcze parę dodatkowych), "menedżer główny" (dziedziczy po wszystkich menedżerach).
zend
Spróbuj stworzyć dynamiczną rolę (np currentUser) i do niej w przy bootstrapingu załaduj wszystkie zasoby do jakich zalogowany użytkownik ma dostęp. To jednak nie zmienia faktu że będziesz musiał namnożyć ifów w widokach żeby wyświetlać tylko te linki do których użytkownik ma dosęp - ewentualnie możesz napisać jakiś zmyśly view helper który wyświetla tylko te linki które po kliknięciu zadziałają.

//Edit - nie doczytałem zbyt dokładnie pierwszego postu smile.gif

Poczytaj o assertach w acl'u to bedzie wygladać tak
  1. $acl -> isAllowed('user', $productRow, 'report');


Innych sposobów na zgranie Zend_Acl z aplikacją niestety nie znam i raczej ich nie ma, ale mam nadzieję że choć trochę pomogłem.

//Edit2

Jeśli masz zamiar pracować na kolekcjach i sprawdzać w pętli uprawnienia, przekazuj do rekodu instancje rowseta, będziesz potem mógł sprawdzić wszystkie uprawnienia dla całej kolekcji jednym zapytaniem, wrzucić to do "zmiennej" i potem korzytać z tych danych. Inaczej zajedziesz baze danch
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.