Symfony 2 i jmsSecurityExtraBundle 17.01 2012

Dodaj komentarz
DODANY O 15:25:02
KATEGORIA: symfony 2 , Techblog

Ostatnio tworzę projekt unijny, gdzie jako podstawę wybraliśmy Symfony 2, zaś warstwą prezentacji ma być interfejs w Ext JS (o dziwo działa to całkiem sympatycznie).

Uparłem się żeby nie pisać wszystkiego z palca z obu stron przez co straciłem setki godzin na szukaniu czegoś co ZNOWU nie było opisane w dokumentacji, zgodnie z tytułem jeden z takich smaczków:

JmsSecurityExtraBundle daje nam możliwość dodawania adnotacji/yml dla np controllera by móc wykonać pre - autoryzację na jakimś obiekcie/klasie opisanym w acl, przykładowy kod:

 
/**
 * @PreAuthorize("hasPermission('company','OWNER') or hasRole('ROLE_SUPER_ADMIN')")
 * @Secure("ROLE_USER")
 * @Route("/deleteCompany/{id}", requirements={"id"="\d+"}, name="test.delete")
 * @param Request $request
 * @param Company $company
 */
public function deleteCompanyAction(Request $request, Company $company) { echo 'jakaś akcja na obiekcie' }
 

Po wywołaniu w przeglądarce: http://exmple.com/prefix/deleteCompany/23 zaczyna się magia:

  • doctrine bundle na podstawie id znajduje nam encję company, jeśli niema wywala 404
  • jms Sprawdza przez acl czy jesteśmy właścicielami encji
  • Na końcu sprawdza jeszcze tylko role
  • No to możemy obsłużyć akcję ;)

UWAGA!!!!
Na tym się sam przejechałem w przypadku użycia annotacji bardzo ważna jest kolejność. O ile samo @Secure może być użyte samodzielnie, o tyle @PreAuthorize MUSI być przed @Secure i nie zadziała przez niego. Jak o tym zapomnicie to czeka was wiele godzin z debuggerem w poszukiwaniu czego zwraca 403 skoro powinno działać.

Dla mnie to jest bug, aczkolwiek z tego co wywnioskowałem z kodu jms inicjuje PreAuthorizeSecurityToken dopiero gdy zostanie wywołany @Secure i zauważy @PreAuthorize