2012-02-01 13 views
7

ho il mio file di sicurezza configurato come segue:Symfony2 No redirect su aree riservate

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:/

Attualmente se accedo i membri URL senza autenticazione mi reindirizza a /public/login ma io non voglio reindirizzare. Principalmente sto rispondendo con JSON sui miei controller, quindi voglio solo mostrare un avviso sull'URL limitato come {"error": "Access denied"}. Se tolgo il codice login_path: /public/login reindirizza a un url/login predefinito. Come faccio a impedirgli di reindirizzare?

+1

voglio fare la stessa cosa. In qualche modo, non ho abbastanza Symfony ... È una richiesta così insolita scrivere controller AJAX ** con ** autenticazione? – apfelbox

risposta

0

Vedere this page per un riferimento completo di configurazione security.yml. Inoltre, this is an even better reference con le spiegazioni di ciascun tasto.

Io suggerirei di creare la propria classe listener per gestire il ritorno JSON quando un utente deve effettuare il login. Esempio: https://gist.github.com/1015146

+0

tali legami hai postato non funzionano, si prega di aggiornare le –

+1

Grazie @ TomášTibenský - risolto. – leek

6

potete fare come ho fatto io: in 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 

in routing.yml

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

è sufficiente aggiungere alla sezione firewall * * access_denied_url param

9

Devi creare un listener e quindi attivare la tua risposta. La mia soluzione è basata su - https://gist.github.com/xanf/1015146

Listener Codice -

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

È necessario creare un servizio per l'ascoltatore -

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

Permettetemi di aggiungere per i lettori futuri: - diano un'occhiata al Symfony \ Component \ Security \ Http \ firewall \ ExceptionListener :: onKernelException(), che è l'impostazione predefinita symfony specifica di esecuzione –

+0

Grazie !!! Questo è esattamente quello che mi serviva :) –

+0

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