Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [inny][SF2]ACL
Forum PHP.pl > Forum > PHP > Frameworki
basso
Witam,

Czytam o ACL i nie mogę uwierzyć.
Pytania:
1. Czy prawa do zasobów muszę sprawdzać w każdym kontrolerze/każdej akcji?

W ZEND 1 wrzucałem takie coś do preDispatch... (metoda wywołująca się przed wywołaniem każdego kontrolera/akcji) i tam sprawdzałem w 1 miejscu do jakich zasobów dany użytkownik ma dostęp i jakie ma prawa.

Tutaj w SF2 jest to pokazane jak poniżej, czyli przy każdej akcje trzeba sprawdzać role i dostęp do zasobów.
Powolutku się wdrażam i chciałbym się dowiedzieć jak te wywołania tak naprawdę działają w SF2.

  1. public function editCommentAction(Comment $comment)
  2. {
  3. $securityContext = $this->get('security.context');
  4.  
  5. // check for edit access
  6. if (false === $securityContext->isGranted('EDIT', $comment))
  7. {
  8. throw new AccessDeniedException();
  9. }
  10.  
  11. // ... retrieve actual comment object, and do your editing here
  12. }

źródło:http://symfony.com/doc/current/cookbook/security/acl.html
wookieb
Jeżeli masz grupę kontrolerów pod jednym prefixem adresu (np admin/) to dostęp do nich możesz zrobić za pomocą firewalla.
W symfony2 również możesz zrobić sobie coś takiego jak preDispatch
http://stackoverflow.com/questions/7293075...hod-in-symfony2
basso
Rozumiem... ale to jest zwykła kontrola dostępu bez sprawdzenia dostępu do zasobu.
Firewall mnie nie urządza.

Czyli
IndexController
nowyArtykulAction
{
Tutaj mają mieć dostęp tylko ludzie z Rolami : Niefajni_Userzy
}
usunArtykulAction
{
Tutaj mają mieć dostęp tylko ludzie z Rolami : Fajni_Userzy
}


Osobiście widziałem, że w każdej akcji wykonywane jest:
  1. $securityContext = $this->get('security.context');
  2.  
  3. // check for edit access
  4. if (false === $securityContext->isGranted('EDIT', $comment))
  5. {
  6. throw new AccessDeniedException();
  7. }


No ale jak dla mnie to jest to jakaś herezja. W żadnym frameworku nie widziałem czegoś takiego, zawsze takie rzeczy robiło się w jednym miejscu przed wywoływaniem kontrolera.
Chciałbym zrobić ACL dobrze, bo podobno są jakieś gotowe rozwiązania... no ale jak ja mam tak klepać w każdej akcji sprawdzenia => To na fajne udogodnienie mi to nie wygląda => zapewne nie umiem tego wywołać.
Kombinować w Kernalach mogę ale chciałbym to zrobić PO LUDZKU smile.gif

Kojarzy może ktoś jak ACL użyć w 1 miejscu nie w każdej akcji?
wookieb
Tak, Symfony2 ma nietypowe podejście do kontrolerów. Nie każdemu ono pasuje.
Jednakże zrobienie listenera, który wywoła Ci preDispatcha ogromną magią nie jest.

Jeżeli jednak tak bardzo boisz się założyć listenera to pozostaje Ci użycie wygodnego bundle-a
JMS Security Extra Bundle
wraz z adnotacjami
http://jmsyst.com/bundles/JMSSecurityExtra...ter/annotations
I od razu cytat
Cytat
Tip: If you like to secure all actions of the controller with the same rule, you may also specify @PreAuthorize on the class itself. Caution though, this rule is only applied to the methods which are declared in the class.
basso
WItam,
Rozumiem...
Zatem podsumujmy:

ACL który dostarcza Symfony 2, defaultowo wywoływany jest w taki sposób:
http://symfony.com/doc/2.0/cookbook/security/acl.html
Czyli każda akcja ogarnięta sprawdzeniem praw.
Okej, ja się z tym godzę, tylko czy to tak faktycznie jest.

Apropos adnotacji... chyba odpada, kurcze za dużo pisania.
A te listernery/eventy są ewidentnie przyporządkowane do konkretnego kontrolera.

Kurcze no... kiszka nie z tej ziemi. Ja właśnie muszę mieć takiego preDispatch który mi pokaże=> jaki kontroler wywołałem i jaką akcję wywołałem, a nie , że muszę podawać Listenera na dany kontroler smile.gif
Tak mam w ZEND
  1. preDispatch
  2. {
  3. $this->_request->getControllerName();
  4. }


i po zabawie .... smile.gif
wookieb
Podchodzisz do tematu strasznie konserwatywnie. Nie mam zamiaru Cię przekonywać co jest lepsze a co gorsze, a z Twojej strony widać tylko i wyłącznie chęć "dokopania" rozwiązaniu.

Cytat
Apropos adnotacji... chyba odpada, kurcze za dużo pisania.

Nie rozumiem dlaczego uważasz wpisanie jednej adnotacji nad klasą uważasz, że to "za dużo pisania."

Poza tym listenera zakładasz na wszystkie kontrolery od razu. Nie da się go założyć na konkretny "kontroler".

Podam link jeszcze raz
http://stackoverflow.com/questions/7293075...#answer-7305537
Listener podany w tamtym temacie wywołuje preDispatch na wszystkich kontrolerach, które zawierają metodę o nazwie "preDispatch".
W podanym kodzie również widać, że masz do dyspozycji obiekt kontrolera oraz nazwę metody jaka ma być wywołana aby uruchomić konkretną akcje.
basso
Witam,
ehhh spokojnie, nie mam złych zamiarów smile.gif

Adnotacje jeśli bym chciał przypisać do 1 kontrolera to bym to zrobił w security w firewall bo na jedno by to wyszło.
A mi chodzi o to, żeby w każdej akcji sprawdzić jakie prawa ma dany user. Tylko nie w ten sposób, żeby w każdej metodzie robić albo to za pomocą adnotacji albo za pomocą wywoływania jakiejś tam metody. Bo to kodu do ACL będę miał mnóstwo ;/

Nic nie pozostaje innego jak tylko ten Listener smile.gif

Dzięki wielkie.
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.