2017-01-03 1 views
0

Meine Symfony3 Login-Seite leitet standardmäßig nach Hause, wie in meiner security.yml Datei angegeben.Symfony Redirect nach Login mit Bedingung auf Benutzer

Ich möchte jedoch, dass es auf meine Seite "Profil bearbeiten" umleitet, wenn der Benutzer es noch nicht erfüllt hat. In jeder anderen Form würde ich dies in der Steuerung machen, aber da es $form->handleRequest($user) im Login-Formular gibt, habe ich keine $user Variable zum testen auf.

Es gibt eine Menge von SO Themen wie Benutzer auf Rollen umleiten basiert, und die documentation erzählt aus dem Aktionsfeld des Formulars oder innerhalb security.yml etwa Umleiten, aber nicht ist, was ich suche.

Wie kann ich basierend auf einer Bedingung umleiten?

NB: aus irgendwelchen Gründen, kann ich nicht FOSUserBundle noch verwenden :-(

+0

Sie in dem Formular mit einer benutzerdefinierten Eingabe wie das umleiten: http://symfony.com/doc/current/security/form_login. html – davidbonachera

+0

Das ist genau der gleiche Link, den ich kenne, den Sie kennen ... –

+0

Hoppla .. Eine Möglichkeit zu tun ist, die Sitzung/Cookie zu verwenden und Redirect, wenn es leer ist. http://symfony.com/doc/current/components/http_foundation.html#setting-cookies/ http://api.symfony.com/3.2/Symfony/Component/HttpFoundation/Cookie.html – davidbonachera

Antwort

0

Ich nehme an, Sie das Garde-Authentifizierungssystem verwenden (http://symfony.com/doc/current/security/guard_authentication.html)

Dann sollten Sie eine Klasse, die AbstractGuardAuthenticator-Klasse erweitern..

in dieser Klasse gibt es eine Methode onAuthenticationSuccess, genannt hier in Ihnen eine gewisse Logik zum Umleiten der Anforderung stellen können. Wenn Sie null hier zurückkehren, wird es einfach weiter, und die Route in Ihrer Sicherheit konfiguriert verwenden. Yml.

Sie müssen den @router-Dienst über dependencyInjection an die Authenticator-Klasse übergeben.

Angenommen, Sie den Router-Dienst übergeben, wird Ihre Methode wie folgt aussehen:

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
{ 
    /** @var User $user */ 
    $user = $token->getUser(); 

    if ($user->hasCompleteProfile() == false) { 
     $url = $this->router->generate('edit_profile'); 

     return new RedirectResponse($url); 
    } 

    // Continue with default behaviour 
    return null; 
} 
+0

Eigentlich habe ich [a Einfaches Registrierungsformular] (https://symfony.com/doc/current/doctrine/registration_form.html) und ein [traditionelles Anmeldeformular] (https://symfony.com/doc/current/security/form_login_setup.html). Ich werde in das Guard Authentication-System schauen, aber die Website, die ich erstelle, ist nicht wegen einer hard-hard Sicherheit, also ist es vielleicht ein Overkill ... –

0

Wenn alles andere fehlschlägt (oder wird eine übermäßige Schmerzen zu behandeln) Sie können immer nur eine Zwischen Strecke einzuführen und zu tun Deine Logik ist da drin.

Erstellen Sie eine Aktion, deren einziger Zweck es ist, Benutzer basierend auf der jeweils benötigten Logik umzuleiten, und diese dann als Zielpfad in die Firewall security.yml zu setzen.

security: 
    firewalls: 
     main: 
      pattern: ^/ 
      anonymous: ~ 
      form_login: 
       login_path: login 
       check_path: login 
       default_target_path: login_success 
       always_use_default_target_path: true 
      logout: 
       path: logout 

Wo die Anmeldung etwas aussehen würde:

class AuthenticationController extends Controller 
{ 
    /** 
    * @Route("/login", name="login") 
    * @Route("/logout", name="logout") 
    */ 
    public function loginAction(Request $request) 
    { 
     // Standard login stuff here 
    } 

    /** 
    * @Route("/login_success", name="login_success") 
    */ 
    public function postLoginRedirectAction() 
    { 
     if (/* user needs to see location A */) { 
      return $this->redirectToRoute("location_a"); 
     } else if (/* user needs to see location B */) { 
      return $this->redirectToRoute("location_b"); 
     } else { 
      return $this->redirectToRoute("index"); 
     } 
    } 
}