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
mrok
post
Post #2





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

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


Cytat
Ogólnie: kontroler powinien zapytać model czy dany użytkownik może wykonać jakąś operację.

Czyli trochę przez analogię powinienem zapytać miotłę zanim ją użyję czy mogę ja użyć? To nie model miotły ale jakiejś zmutowanej super miotły.

Ja myślałem zrobić to trochę inaczej

  1.  
  2.  
  3. class DocumentOwnerAsseration implements toCoTrzeba {
  4.  
  5. private $_request;
  6.  
  7. public function __construct(Zend_Request_Abstract $request) {
  8. $this->_request = $request;
  9. }
  10.  
  11. public function assert(Zend_Acl $acl, Zend_Acl_Role_Interface $role = null, Zend_Acl_Resource_Interface $resource = null, $privilege = null) {
  12. $document = Doctrine::getTable('Documents')->find($this->_request->getParam('doc_id'));
  13. if ($document->Company->isWorker(XX_Auth::getInstance()->getUser()))
  14. return true;
  15.  
  16. // tu jakis ladne info do flash messengera dlaczego cos jest zle
  17. return false;
  18. }
  19.  
  20. }
  21.  
  22. class AclPlugin extends Zend_Plugin_Abstract {
  23.  
  24. public function routeStartup() {
  25.  
  26. //tutaj cala zabawa z inicjacja acla
  27. $alc->allow(rola, resource, action, new DocumentOwnerAsseration($this->getRequest()));
  28.  
  29. if ($alc->isAllow())
  30. return true;
  31.  
  32. throw new Exception();
  33. }
  34.  
  35. }
  36.  


Wszystko (nie jest to jakaś strasznie skomplikowana logika) odbywa się w pluginie, żaden controller nie musi być odpalony.
Kwestia roli (księgowa, sprzątaczka, etc) jest zabezpieczona przez regułki ACLa, dodatkowy assert tylko sprawdza czy dokument należy do firmy usera.


//Dellas
Dzięki za linka - trochę podobne do tego co napisałem powyżej.
Tak kilka uwag na szybko.
1. Definicja formularza w zend_form od 1.8 ma być nie w konstruktorze, ale w init()
2. Zend_Auth w metodzie authenticate()
posiada juz kod
  1. $this->getStorage()->write($result->getIdentity());

więc powtarzanie go w AuthenticationControllerze jest niepotrzebne.
3. Nie bardzo rozumiem jak ustawiany jest "$comment" przekazywany do CommentAssertion.php ani Id ani modelu tego obieku w kodzie nie widze ;( Tobie udało sie to rozgryźć?

Ten post edytował mrok 31.10.2010, 20:58:39
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: 7.10.2025 - 20:58