Clicky

Skocz do zawartości


Zdjęcie
- - - - -

[K2] Zend_Acl/Auth jako biblioteka Kohany

7 odpowiedzi w tym temacie

  • Zaloguj się, aby dodać odpowiedź

#1 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 23 styczeń 2008 - 12:00

// wydzielone z tematu http://forum.kohanap...topic,26.0.html

hehe :) No jednak należy patrzeć na SVN bo różnice od ostatniej stabilnej wersji są spore.

Auth tez już jest chociaż bardzo prosty i dla mnie niewystarczający. Tez byłbym zainteresowanymi tymi z zenda ale powiedz mi czy to da się łatwo podpiąć pod bazę (acl)?

#2 suda

suda

    Początkujący

  • Użytkownik
  • Pip
  • 12 postów
  • Skąd:Warszawa

Napisano 23 styczeń 2008 - 13:07

Teraz będę częściej tam zaglądać ;)

Co do Acl, to trzeba by generować całą listę wg. bazy danych, więc aby to przyspieszyć potrzebowałem jakiegoś cacheowania obiektów (stąd ten lib). Adaptuję właśnie Zend_Acl (niestety tylko w godzinach wieczornych bo nie mam za wiele wolnego czasu), tak aby synchronizowała się z bazą danych i automatycznie się cacheowała. Jak skończę i przetestuję, to od razu umieszczę tu (i na swoim blogu :P) źródełka :)

Zend_Auth w moim przypadku jest idealny, jako, że aplikacja będzie mieć co najmniej dwie lub trzy metody autoryzacji (zwykłe logowanie POST-em, autoryzacja w aplikacji-rodzicu przez ich API i ew. własne API do autoryzacji-transferu tożsamości pomiędzy własnymi serwisami) i w Zendzie wystarczy napisać własne adaptery.
One swallow does not make girlfriend

#3 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 23 styczeń 2008 - 16:36

nie wiem czy mówimy o tym samym - chodzi mi o to, że mam nieskończoną liczbę grup, nieskończona liczbę userów, każdy user może być w nieskończonej ilości grup, no i grupy mają swoje prawa dostępu. Na bazie wszystko. Przeglądałem kilka razy manual zenda ale nie bardzo mogę to ugryźć od tej strony DB, a wolałbym skorzystać ze sprawdzonej klasy zamiast rzeźbić swoją.



#4 suda

suda

    Początkujący

  • Użytkownik
  • Pip
  • 12 postów
  • Skąd:Warszawa

Napisano 23 styczeń 2008 - 18:24

Rozwiązanie Twojego problemu widział bym jako trzy tabele:
-users2groups (user_id, group_id)
-groups (id, name)
-groups_permissions (group_id, resource, mode)

Teraz żeby utworzyć ACL, najpierw lecisz po groups, tworząc rolę dla każdej grupy i dodając resource wg. groups_permissions. Potem lecąc po users2groups tworzyć role dla każdego usera podając jako rodziców role grup do których przynależy. Jak masz gotową ACL, lepiej ją cacheować bo samo budowanie nie będzie należeć do najszybszych.

Wydaje mi się jednak, że lepiej będzie pozwolić userowi być członkiem tylko jednej grupy, ale utworzyć ich tyle aby spełniały oczekiwania. Jeśli chcesz np. zbierać użytkowników w podgrupy (np. klany) i chcesz blokować dostęp np. edycji tylko w obrębie klanu, to ACL może urosnąć do olbrzymich rozmiarów, więc wtedy może lepiej było by to zaimplementować w autoryzacji (np. przechowywanie w sesji, klanów do których przynależy user).

BTW: Chyba robimy mały offtop :P
One swallow does not make girlfriend

#5 cmike

cmike

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 132 postów
  • Skąd:Krk

Napisano 23 styczeń 2008 - 19:04

Spoko - w końcu rozmiawasz z moderatorem  ;)

#6 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 23 styczeń 2008 - 19:50

Nie, nie, limitować grup userowi nie mogę bo może chcieć mieć ich nawet tysiąc ;) I tak, oczywiście po zalogowaniu trzeba mu jego ACL wstawić w sesje, a najbezpieczniej przy każdej akcji pytać bazę choć to znowu kolejne SQle (te dzisiejsze aplikacje są taaaaakie zasobo(bazo)żerne ;) ).

Ogólnie trochę mnie przeraża pisanie tego ;) ale lada dzień do tego dojdę :/ brr...

To jeszcze można zrobić na innym poziomie: konfiguracja możliwości grupy to nie role a po prostu dalsze pola w tabeli groups. Gorzej jak teraz w to wbić np. moderatorów danej grupy... wrr....

#7 suda

suda

    Początkujący

  • Użytkownik
  • Pip
  • 12 postów
  • Skąd:Warszawa

Napisano 23 styczeń 2008 - 20:32

@cmike: spoko ale 'Ordnung must sein' :P

@nrm: co do ciągłego odpytywania bazy przy akcjach, to była by przesadna dbałość o bezpieczeństwo (nie ma wacka, żeby ktoś zmienił sobie ACL zapisany w sesji). Można by 'grupowe' ACL-e przechowywać w cache i odświeżać po dokonaniu zmiany w uprawnieniach (admin/mod nie miał by dostępu do zmiennych sesyjnych zwykłego usera a cache jest wspólny).

Modów danej grupy można zrobić poprzez tworzenie kilku ról dla grupy np. group_NAZWA_moderator, group_NAZWA_owner etc.

Faktycznie to będzie nie lada wyzwanie, więc lepiej raz to dobrze zaprojektować, żeby się później nie grzebać w niezrozumiałym guano :P

EDIT:
Właśnie przerobiłem Zend_Acl na bibliotekę Kohany. Do zassania tutaj: http://files.suda.pl...d_acl_1_0_3.zip
W tym momencie cacheowanie jest włączone na stałe (zmienna $_useCache). Przykładowe użycie zaczerpnięte z http://framework.zen...n/zend.acl.html:


<?php
    $this->load->library('Acl');
   
    $this->Acl->addRole(new Acl_Role('guest'))
              ->addRole(new Acl_Role('member'))
              ->addRole(new Acl_Role('admin'));
           
    $parents = array('guest', 'member', 'admin');
    $this->Acl->addRole(new Acl_Role('someUser'), $parents);

    $this->Acl->add(new Acl_Resource('someResource'));
   
    $this->Acl->deny('guest', 'someResource');
    $this->Acl->allow('member', 'someResource');
   
    echo $this->Acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
   
    $this->Acl->deny('someUser', 'someResource');   
    echo $this->Acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';
?>

Po tym można 'zakomentować' linijki modyfikujące ACL, odświeżyć i cieszyć się, że poszło z cache :P Zapraszam do testowania :)
One swallow does not make girlfriend

#8 nrm

nrm

    webmastah

  • Admin
  • 1106 postów
  • Skąd:Katowice

Napisano 24 styczeń 2008 - 14:17

dzięki, ja na razie jestem na etapie rozrysowania tego i myślenia czy zend_acl w ogóle sie do tego nada. problem jest troche skomplikowany i mam przegrzewanie sie mozgownicy ;) to nie tylko musi działać alebyć szybkie i elastyczne,żeby potem nie kombinować w połowie działania serwisu.

Jestem ciekaw jak to mają rozwiązane takie serwisy jak profeo czy goldenline. macie pomysły? rozrysowałem sobie 2 wersje przy czym druga jest tak skomplikowana, ze chyba wybiore wersje uproszczoną.




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych