Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [inny][SF2]ACL, Nie da się umieścić warunków ACL w jednym miejscu?
basso
post 10.12.2012, 10:27:46
Post #1





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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
Go to the top of the page
+Quote Post
wookieb
post 10.12.2012, 11:32:10
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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


--------------------
Go to the top of the page
+Quote Post
basso
post 11.12.2012, 22:40:32
Post #3





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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?

Ten post edytował basso 11.12.2012, 22:41:05
Go to the top of the page
+Quote Post
wookieb
post 11.12.2012, 22:52:20
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
basso
post 11.12.2012, 23:39:31
Post #5





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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
Go to the top of the page
+Quote Post
wookieb
post 12.12.2012, 09:57:08
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.


--------------------
Go to the top of the page
+Quote Post
basso
post 12.12.2012, 20:32:49
Post #7





Grupa: Zarejestrowani
Postów: 155
Pomógł: 1
Dołączył: 12.12.2010

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


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.
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 Wersja Lo-Fi Aktualny czas: 24.05.2024 - 17:36