Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]ACL i utrwalania zasobów w bazie mysql
Forum PHP.pl > Forum > PHP > Frameworki
Lysiur
Witam, aktualnie tworzę pewien system CRM (oparty o ZF1), muszę zrobić dość elastyczne rozwiąznia, które będą w miarę przenośne.

system będzie wykorzystywał ACL'a opartego o bazie.

table acl_roles (id_role,code,name),
table acl_resources (id_acl_resurce, module,controller,action)
table acl_privileges (id_role,id_acl_resources, type)

Wypełnianie acl_resources jest automatyczne, tz. lecę po systemie plików i generuje np.: tablicę posortowaną wg. nazwy modułu,controllera, akcji

  1. array('module'=>'test','controller'=>'testowy','action'=>'testowa'),
  2. array('module'=>'test2','controller'=>'testowy2','action'=>'testowa2'),
  3. etc...
  4. )


I teraz chciałbym przejść do sedna sprawy. W jaki sposób rozwiązaliście byście kwestię utrwalania takiego zbioru w acl_resources?

Oczywiście można polecieć w pętli i dodawać kolejno do bazy, ale problem zaczyna się, gdy np.: jakiś controller czy akcja ulegnie zmienia, (np.: jedna zostanie usunięta, inna będzie miała zmienioną nazwę, inna zostanie dodana). Macie jakieś doświadczania lub sposoby by w jakiś elegancji sposób odświerzyć listę zasobów w tabeli acl_resources questionmark.gif

Dopiero będę nad tym myślał, być może jest jakaś fajna funckja do porownywania dwóch zbiorów?
irmidjusz
Po pierwsze, sensowny zapis ACL dla Zend_Acl w bazie możę być skomplikowany. Musisz wziąć pod uwagę koszt budowania ACLa i ewentualnego cache'owania go i uaktualniania, oraz zarządzania tym wszystkim w panelu administratora (o ile przewidujesz coś takiego). Przygotuj się na dużo pracy tongue.gif
Po drugie, przemyśl dobrze, czy w ogóle robienie uprawnień dla każdej akcji w każdym kontrolerze jest aby na pewno tym, czego potrzebujesz. Dla mnie osobiście to bez sensu, nigdy bym tak nie zrobił (to ma sens jedynie w przypadku bardzo prostych stronek). Wyodrębnij sobie koncepcyjnie zasoby, role i akcje na wyższym poziomie organizacji, niż pliki/kontrolery/akcje. Często to jednego uprawnienia należy wiele akcji, modeli itp. Przykładowo coś w stylu: Manager może przeglądać uploadowane zdjęcia Usera i w razie potrzeby wyłączać je z wyświetlania (takie moderowanie) - to co, chcesz w takim przypadku pytać o to, czy Manager może wykonać akcje: /manager/moderate/showUserProfile, /photo/moderate/disable, /user/abuse/warning ? wink.gif (są trzy bo jedna od wejścia na stronę, a dwie od requestów ajaxowych). Jak się w tym połapiesz? Czy nie lepiej, jeśli będziesz sprawdzał tylko
  1. $acl->isAllowed('Manager', 'UserPhoto', 'moderate');
wszędzie tam, gdzie trzeba?
Lysiur
Dziekuje za odpowiewdź. W ostatnim projekcie, zrelizowałem takie rozwiązanie o którym pisałem, aczkoliwek nie korzystałem wtedy z Zend_Acl. System zakładał, iż jeden moduł był dostępny bez identyfikacji, reszta modułów wymagała autoryzacji. Dla chronionych modułów, każda akcja była sprawdzana, czy dany użytkownik ma do tego dostęp. Była też część administracyjna, gdzie każdy modul/controller/action była przypisana do jednego lub kilku ról. Zdawałem sobie sprawę, że aktualizacja uprawnień będzie upierdliwa, (bo każdą nową akcję trzeba dodać do zasobów i zaznaczyć odpowiednie role), nie mniej jednak rozwiązanie było elastyczne i dało radę. Choć przeglądanie kilkudziesięciu akcji było nieco karkołomne.

Jeśli dobrze zrozumiałem, to proponujesz wyłonić grupy, np: według założeń funckjonalnych, i w nich zrgrupować odpowiednie controllery/akcje. A odpowiednim rolom nadać dostęp do odpowiednich grup?
irmidjusz
Cytat(Lysiur @ 19.12.2012, 14:13:24 ) *
Jeśli dobrze zrozumiałem, to proponujesz wyłonić grupy, np: według założeń funckjonalnych, i w nich zrgrupować odpowiednie controllery/akcje. A odpowiednim rolom nadać dostęp do odpowiednich grup?


tak, coś w tym stylu.
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.