2012-02-06 6 views
15

Sto cercando di ottenere la mia messa a punto roba di sicurezza per Symfony2 e devo farlo funzionare finora, ma ora ho bisogno di fare alcune cose più di fantasia. Attualmente sto usando tutto ciò che riguarda l'autenticazione preliminare (io uso 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.Usando di Symfony2 AccessDeniedHandlerInterface

Ora sono al punto in cui voglio catturare gli utenti che lanciano 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. Io sto guardando il AccessDeniedHandlerInterface.

  1. E 'questa la direzione giusta per me essere in corso?
  2. Come faccio ad aggiungere questo gestore per l'ascoltatore eccezione?

MODIFICA: Ho finito per fare qualcosa di simile. Ho creato un servizio che viene spinto sull'evento kernel.exception. services.yml assomiglia a questo:

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

e la classe è di per sé:

<?php 

namespace Fully\Qualified\Namespace\Path\To; 

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent, 
Symfony\Component\HttpFoundation\Response, 
Symfony\Component\Security\Core\Exception\AccessDeniedException; 

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

risposta

21

Questo suona circa la destra.

Oppure, se siete specificamente interessati a AccessDeniedException si potrebbe anche definire access_denied_handler all'interno del firewall in security.yml:

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

quindi definire il vostro servizio nella vostra services.xml o equivalente:

<parameters> 
    <parameter key="kernel.listener.security.class">Path\To\Your\Class</parameter> 
</parameters> 

<service id="kernel.listener.access_denied.handler" class="%kernel.listener.security.class%"> 
    <tag name="kernel.event_listener" event="security.kernel_response" method="handle" /> 
</service> 

Il classe 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) 
    } 
} 

Potete trovare di riferimento di sicurezza completa di Symfony2 qui: http://symfony.com/doc/2.8/reference/configuration/security.html