Symfony 2 i jmsSecurityExtraBundle 17.01 2012
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