Utilizzo di AccessDeniedHandlerInterface di Symfony2

Sto cercando di ottenere la configurazione della mia sicurezza per symfony2 e ho funzionato fino ad ora, ma ora ho bisogno di fare altre cose fantasiose. Attualmente sto utilizzando tutto ciò che riguarda PreAuthentication (utilizzo un componente di terze parti per l’accesso e la gestione delle sessioni). Questa parte sta funzionando alla perfezione con il bundle di sicurezza JMS.

Ora sono al punto in cui voglio catturare gli utenti che stanno lanciando 403 quindi posso semplicemente inviarli alla pagina di accesso del componente di terze parti che sto usando. Penso che la mia migliore scommessa sia quella di aggiungere un gestore di eccezioni al listener di eccezioni. Sto guardando AccessDeniedHandlerInterface .

  1. È questa la direzione giusta per me andare?
  2. Come posso aggiungere questo gestore al listener delle eccezioni?

EDIT: ho finito per fare qualcosa di simile. Ho creato un servizio che viene richiesto sull’evento kernel.exception. services.yml si presenta così:

services: kernel.listener.accessDenied: class: Fully\Qualified\Namespace\Path\To\Class tags: - { name: kernel.event_listener, event: kernel.exception, method: onAccessDeniedException } 

e la class stessa:

 getException(); //Get the root cause of the exception. while (null !== $exception->getPrevious()) { $exception = $exception->getPrevious(); } if ($exception instanceof AccessDeniedException) { //Forward to third-party. } } } 

Suona bene.

Oppure, se sei specificamente interessato a AccessDeniedException, puoi definire anche access_denied_handler all’interno del tuo firewall in security.yml :

 security: firewalls: my_firewall: # ... access_denied_handler: kernel.listener.access_denied.handler # ... 

Quindi definisci il tuo servizio nel tuo services.xml o equivalente:

  Path\To\Your\Class     

La class del gestore:

 use \Symfony\Component\Security\Http\Authorization\AccessDeniedHandlerInterface; class MyAccessDeniedHandler implements AccessDeniedHandlerInterface { public function handle(Request $request, AccessDeniedException $accessDeniedException) { // do something with your exception and return Response object (plain message of rendered template) } } 

È ansible trovare il riferimento completo sulla sicurezza di Symfony2 qui: http://symfony.com/doc/2.8/reference/configuration/security.html