2012-02-01 12 views
7

Mam plik zabezpieczeń skonfigurowane następująco:Symfony2 Nie przekierować na ograniczonych obszarach

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

Obecnie jeśli mam dostępu członkowie URL bez uwierzytelniania przekierowuje mnie do /public/login ale nie chcę go przekierować. Głównie odpowiadam jsonem na moje kontrolery, więc chcę pokazać ostrzeżenie na ograniczonym adresie URL, takim jak {"error": "Access denied"}. Po wyjęciu kodu login_path: /public/login przekierowuje do domyślnego adresu URL/logowania. Jak zrobić, aby nie przekierować?

+1

chcę zrobić to samo. Jakoś nie mogę dostać Symfony ... Czy jest to taka niezwykła prośba o napisanie kontrolerów AJAX ** z ** uwierzytelnianiem? – apfelbox

Odpowiedz

0

Zobacz pełną informację o konfiguracji this pagesecurity.yml. Ponadto, this is an even better reference z objaśnieniami każdego klucza.

Proponuję utworzyć własną klasę nasłuchiwania do obsługi zwrotu JSON, gdy użytkownik musi się zalogować. Przykład: https://gist.github.com/1015146

+0

opublikowane przez Ciebie linki nie działają, zaktualizuj je –

+1

Dzięki @ TomášTibenský - poprawiono. – leek

6

Można zrobić tak jak ja: w 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 

w routing.yml

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

po prostu dodać do sekcji zapory * access_denied_url * param

9

Musisz utworzyć odbiornik, a następnie wywołać odpowiedź. Moje rozwiązanie opiera się na - https://gist.github.com/xanf/1015146

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

Trzeba utworzyć usługa dla słuchacza -

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

Pozwól mi dodać dla przyszłych czytelników: - Spójrz na Symfony \ Component \ Security \ Http \ Firewall \ ExceptionListener :: onKernelException(), która jest domyślną implementacją symfony- –

+0

Dzięki !!! To jest dokładnie to, czego potrzebowałem :) –

+0

w "|| $ wyjątek instanceof AuthenticationCredentialsNotFoundException" нет необходимости, ибо обо наследует "AuthenticationException" – bfday

Powiązane problemy