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 (1 - 8)
Spawnm
post
Post #2





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Do tego acl raczej nie będzie potrzebny.
Jeśli wszystko jest oparte o bazę danych to sprawdzaj czy user należy do danej firmy jeśli tak może przeglądać i pobierać dane.
A ACL daj aby ustalić co konkretnie może przeglądać no i czy może dodawać, edytować, kasować.
Go to the top of the page
+Quote Post
mrok
post
Post #3





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

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


Cytat
Jeśli wszystko jest oparte o bazę danych to sprawdzaj czy user należy do danej firmy jeśli tak może przeglądać i pobierać dane.

Oto właśnie chciałem zapytać - gdzie najlepiej to sprawdzić?

Przecież user może sobie spokojnie zmienić w linku
www.blebleble.pl/x/y/z/doc_id/7 na np www.blebleble.pl/x/y/z/doc_id/8

ACL wg Ciebie powinien to puścić ponieważ user ma prawo do przeglądania, edycji, etc. dokumentów

Teraz w modelu dokumentu należałoby dodać jakieś metody które sprawdzają czy user może przeglądać, edytować, usuwać, wysyłać etc.
Mnóstwo sprawdzania zależnego od kontekstu usera, na dodatek trzeba by taką metodę (canEdit, canDelete) wywoływać ręcznie i tu każdy może sie pomylić (albo co gorsza zapomnieć).

Nie ma ciekawszych rozwiązań? Niekoniecznie opartych o ACLe


--------------------
Go to the top of the page
+Quote Post
destroyerr
post
Post #4





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
Deallas
post
Post #5





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 4.01.2007

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


Tu jest bardzo dobrze wytłumaczone o czym mówił @destroyerr: http://alex-tech-adventures.com/developmen...assertions.html
Go to the top of the page
+Quote Post
mrok
post
Post #6





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
Spawnm
post
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Tak po najniższej linii oporu można by ten ACL załatwić jednym zapytaniem

query('select * form documents where firma_id = ?', $_SESSION['user_firma_id'] );

I dopiero dla delete czy update sprawdzać w jakiś innych tabelach czy user jest w grupie ADMIN ew. czy w tabeli user_acl ma INSERT_DOC , UPDATE_DOC itd.
Jednak to już bym wyjął po za klasę operacji na tabeli documents.
Go to the top of the page
+Quote Post
murwazy
post
Post #8





Grupa: Zarejestrowani
Postów: 53
Pomógł: 5
Dołączył: 13.04.2007
Skąd: Szczecin

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


dokument jest przypisany do uzutkownika/firmy, przy czytaniu sprawdzasz czy zalogowany chce czytac wlasny dokument, tak samo z kasowaniem itp sprawami.
acla bym w to nie mieszal
Go to the top of the page
+Quote Post
destroyerr
post
Post #9





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

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


Cytat
przy czytaniu sprawdzasz czy zalogowany chce czytac wlasny dokument

Mam wrażenie, że autor wie co ma sprawdzać, a pyta o to "gdzie i jak?".
Ja jednak będę polecał Acl.
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 - 05:21