2012-02-01 19 views
7

he configurado mi archivo de seguridad de la siguiente manera:Symfony2 No se redirigir en áreas restringidas

security: 
... 
      pattern: ^/[members|admin] 
      form_login: 
       check_path: /members/auth 
       login_path: /public/login 
       failure_forward: false 
       failure_path: null 
      logout: 
       path: /public/logout 
       target:/

Actualmente si accedo a los miembros de la dirección URL sin autenticar me redirige a /public/login pero no quiero que se redirija. Principalmente estoy respondiendo con json en mis controladores, así que solo quiero mostrar una advertencia en la URL restringida, como {"error": "Access denied"}. Si saco el código login_path: /public/login, redirige a un url/login predeterminado. ¿Cómo hago para evitar que se redireccione?

+1

Quiero hacer lo mismo. De alguna manera, no entiendo muy bien Symfony ... ¿Es una solicitud tan inusual escribir controladores AJAX ** con ** autenticación? – apfelbox

Respuesta

0

Ver this page para la referencia de configuración completa security.yml. Además, this is an even better reference con explicaciones de cada tecla.

Sugiero crear su propia clase de oyente para manejar el retorno de JSON cuando un usuario necesita iniciar sesión. Ejemplo: https://gist.github.com/1015146

+0

esos enlaces que publicó no están funcionando, por favor, actualícelos –

+1

Gracias @ TomášTibenský - corregido. – leek

6

usted puede hacer como lo hice: en security.yml

firewalls: 
     administrators: 
      pattern: ^/ 
      form_login: 
       check_path: _security_check 
       login_path: _security_login 
      logout: true 
      security: true 
      anonymous: true 
      access_denied_url: access_denied 

en routing.yml

access_denied: 
    path: /error403 
    defaults : 
     _controller: FrameworkBundle:Template:template 
     template: 'DpUserBundle:Static:error403.html.twig' 

sólo tiene que añadir a la sección cortafuegos * * access_denied_url parámetro

9

Necesita crear un Oyente y luego activar su respuesta. Mi solución se basa en - https://gist.github.com/xanf/1015146

Código Listener -

namespace Your\NameSpace\Bundle\Listener; 

use Symfony\Component\HttpFoundation\JsonResponse; 
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 

class AjaxAuthenticationListener 
{ 

/** 
* Handles security related exceptions. 
* 
* @param GetResponseForExceptionEvent $event An GetResponseForExceptionEvent instance 
*/ 
public function onCoreException(GetResponseForExceptionEvent $event) 
{ 
    $exception = $event->getException(); 
    $request = $event->getRequest(); 

    if ($request->isXmlHttpRequest()) { 
     if ($exception instanceof AuthenticationException || $exception instanceof AccessDeniedException || $exception instanceof AuthenticationCredentialsNotFoundException) { 
      $responseData = array('status' => 401, 'msg' => 'User Not Authenticated'); 
      $response = new JsonResponse(); 
      $response->setData($responseData); 
      $response->setStatusCode($responseData['status']); 
      $event->setResponse($response); 
     } 
    } 
} 
} 

Es necesario crear un servicio para el oyente -

e_ent_int_baems.ajaxauthlistener: 
    class: Your\NameSpace\Bundle\Listener\AjaxAuthenticationListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.exception, method: onCoreException, priority: 1000 } 
+1

Permítanme agregar para futuros lectores: - Eche un vistazo a Symfony \ Component \ Security \ Http \ Firewall \ ExceptionListener :: onKernelException() que es la implementación de Symfony por defecto: –

+0

¡¡¡Gracias !!! Esto es exactamente lo que necesitaba :) –

+0

en "|| $ exception instanceof AuthenticationCredentialsNotFoundException" нео необходимости, ибо оно наследует "AuthenticationException" – bfday

Cuestiones relacionadas