Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [ZendFramework]Uprawnienia, kontrola dostępu, ACL
sonicpb
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 9.10.2009

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
CzarnyGsm
post
Post #2





Grupa: Zarejestrowani
Postów: 84
Pomógł: 2
Dołączył: 16.04.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował CzarnyGsm 12.05.2012, 15:24:11
Go to the top of the page
+Quote Post
Pilsener
post
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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).
Go to the top of the page
+Quote Post
zend
post
Post #4





Grupa: Zarejestrowani
Postów: 580
Pomógł: 85
Dołączył: 25.03.2010
Skąd: Skrzyszów :)

Ostrzeżenie: (0%)
-----


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

Ten post edytował zend 13.05.2012, 19:34:29
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 18:46