2012-02-06 11 views
15

Estoy tratando de instalar mis cosas de seguridad para Symfony2 y lo tengo funcionando hasta ahora, pero ahora necesito hacer algunas cosas más sofisticadas. Actualmente estoy usando todo lo relacionado con la autenticación previa (uso un componente de terceros para iniciar sesión y administrar sesiones). Esa parte funciona a la perfección junto con el paquete de seguridad JMS.Usando AccessDeniedHandlerInterface de Symfony2

Ahora estoy en el punto en el que quiero ver a los usuarios que lanzan 403, así que puedo reenviarlos a la página de inicio de sesión del componente de terceros que estoy usando. Creo que mi mejor opción es agregar un controlador de excepción al oyente de excepción. Estoy mirando el AccessDeniedHandlerInterface.

  1. ¿Es esta la dirección correcta para mí?
  2. ¿Cómo agrego este controlador al detector de excepciones?

EDIT: Terminé haciendo algo similar. Creé un servicio que se solicita en el evento kernel.exception. services.yml se ve así:

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

y el yo que la clase:

<?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. 
    } 
    } 
} 

Respuesta

21

Esto suena bastante bien.

O, si usted está interesado específicamente en AccessDeniedException también se puede definir access_denied_handler dentro de su firewall en security.yml:

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

A continuación, defina su servicio en su 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> 

El clase de controlador:

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

Puede encontrar la referencia de seguridad completa de Symfony2 aquí: http://symfony.com/doc/2.8/reference/configuration/security.html