7 Stimmen

symfony2 Kein Redirect auf gesperrte Bereiche

Ich habe meine Sicherheitsdatei wie folgt konfiguriert:

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

Wenn ich derzeit auf die Mitglieder-URL zugreife, ohne mich zu authentifizieren, werde ich auf folgende Seite umgeleitet /public/login aber ich möchte nicht, dass es weitergeleitet wird. Ich bin vor allem mit json auf meine Controller reagieren, so dass ich nur eine Warnung auf die eingeschränkte url wie zeigen wollen {"error": "Access denied"} . Wenn ich die Karte herausnehme login_path: /public/login Code wird auf eine Standard-URL /login umgeleitet. Wie kann ich die Weiterleitung verhindern?

9voto

Pratyush Punkte 1176

Sie müssen einen Listener erstellen und dann Ihre Antwort auslösen. Meine Lösung basiert auf - https://gist.github.com/xanf/1015146

Hörer Code --

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

Sie müssen einen Dienst für den Hörer erstellen.

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

6voto

1nstinct Punkte 1524

Sie können es wie ich machen: 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'

einfach zum Firewall-Abschnitt hinzufügen *access_denied_url* param

0voto

leek Punkte 11253

Véase diese Seite für die vollständige security.yml Konfigurationsreferenz. Auch, Dies ist eine noch bessere Referenz mit Erläuterungen zu jeder Taste.

Ich würde vorschlagen, dass Sie Ihre eigene Listener-Klasse erstellen, um die Rückgabe von JSON zu behandeln, wenn ein Benutzer sich anmelden muss. Beispiel: https://gist.github.com/1015146

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X