Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZendFramework]Warunkowy ACL, czy ja to dobrze rozumiem
mrok
post
Post #1





Grupa: Zarejestrowani
Postów: 258
Pomógł: 17
Dołączył: 22.05.2007

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


Pracuję nad systemem do zarządzania firmą, który nie będzie sprzedawany w pudełku, ale każdy chętny będzie sobie mógł założyć konto i w obrębie jego pracować (dostęp przez www).

Implikuje to nałożenie ograniczeń do zasobów, tak aby user z firmy X nie mógł przeglądać dokumentów z firmy Y.

Dotychczas poprzednicy napisali w tym celu sporo metod rozrzuconych po modelach i kontrolerach - ogólnie lekki burdel.

Chciałbym trochę tego posprzątać i tę logikę przenieść do "warunkowych ACLi"

np
  1. $acl = new Zend_Acl();
  2. $acl->allow('owner', 'document:list', 'show', new CompanyAssertion());


Czy ktoś podziela taki pomysł (może powinienem zrobić ankietę)? Podobno poprzednicy to byli prawdziwi ninja i zastanawiam się czy przypadkiem nie próbuję wynaleźć koła na nowo.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
destroyerr
post
Post #2





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

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


Problem spory i zależy od reszty architektury systemu.
Ogólnie: kontroler powinien zapytać model czy dany użytkownik może wykonać jakąś operację. Więc model powinien mieć interfejs udostępniający możliwość sprawdzenia tego dostępu i to jest chyba jasne. Natomiast najważniejsza kwestia jak model powinien sprawdzać czy jest dostęp. Próbowałem stworzyć podobny system do Twojego (niestety bardziej rozbudowany) i chyba się udało, więc Zend_ACL się nadaje. Ma moim zdaniem jest w nim parę niekonsekwencji (ale to moja interpretacja).
Zdecydowanie dla użytkowników i np. dokumentów nie tworzyłbym tekstowych ról i zasobów tylko skorzystałbym z Zend_Acl_Role_Interface i Zend_Acl_Resource_Interface. Wtedy w CompanyAssertion dostajesz do sprawdzenia obiekt użytkownika i obiekt zasobu dzięki czemu sprawnie możesz pobrać od użytkownika i dokumentu firmę i wtedy porównać. Czyli coś takiego:
  1. class User implements Zend_Acl_Role_Interface
  2. {
  3. public function getRoleId()
  4. {
  5. return sprintf('user:%s', $this->getId());
  6. }
  7. }
  8.  
  9. class Document implements Zend_Acl_Resource_Interface
  10. {
  11. public function getResourceId()
  12. {
  13. return sprintf('document:%s', $this->getId());
  14. }
  15.  
  16. public function canEdit($user)
  17. {
  18. return $this->can($user, 'edit');
  19. }
  20.  
  21. public function can($user, $privilege)
  22. {
  23. return $this->acl->isAllowed($user, $this, $privilege);
  24. }
  25. }
  26.  
  27. class CompanyAssertion implements Zend_Acl_Assert_Interface
  28. {
  29. public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null)
  30. {
  31. return $role->getCompanyId() == $resource->getCompanyId();
  32. }
  33. }
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 02:05