2016-02-23 12 views
5

Wenn ich eine sichere Route habe, sagen wir wie panel von unten, wird Symfony den Zugriff nur für angemeldete Benutzer erlauben.Symfony Sicherheitsumleitung zur Anmeldeseite

- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/panel, role: ROLE_USER } 

Für Anwender, die darin nicht angemeldet sind, werden sie immer auf die login_path umleiten (Ich verwende FOSUserBundle):

security: 
    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       login_path:  fos_user_security_login 

Wo kann ich diese deaktivieren oder außer Kraft setzen umleiten? Ich möchte ein Login-Formular direkt anzeigen, ohne den Benutzer umzuleiten.

Ich glaube, es hat mit AccessDeniedHandlerInterface zu tun, aber welcher Schlüssel muss in security.yml überschrieben werden? Und wo ist die Standardimplementierung?

Für andere Situationen haben wir DefaultLogoutSuccessHandler, DefaultAuthenticationFailureHandler, DefaultAuthenticationSuccessHandler und wir können einen Service für jede dieser Situationen implementieren, der ihre jeweiligen Schnittstellen erweitert und die Situation in einer benutzerdefinierten Weise behandeln kann. Für AccessDenied kann jedoch nichts gefunden werden. Its directory enthält nur die Schnittstelle.

+2

Was ist der Vorteil? Nach dem Einloggen würde der Benutzer zurück zu/Panel umgeleitet werden und es würde sich nicht anders anfühlen - was fehlt mir? – ccKep

+0

Ich möchte eine Login-Seite auf ein paar Routen hinzufügen. Der Benutzer möchte auf die Seite zugreifen, aber er ist nicht eingeloggt, also stelle ich ihm das Login-Formular vor und nach der Anmeldung (mit Ajax) wird er zum Panel weitergeleitet. –

+0

um ein Login-Formular anzuzeigen, sollten Sie auch anonymen Zugriff erlauben. Überprüfen Sie daher die Berechtigung in einer Steuerung, zum Beispiel – Heah

Antwort

3

Ich würde dies manuell tun.

Machen Sie Ihre Route erreichbar anonym:

- { path: ^/panel, role: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_USER] } 

in Ihrer Vorlage prüfen, ob ein angemeldeter Benutzer ist:

{% if app.user is null %} 
    <!-- Then display your login form --> 
{% else %} 
    <!-- Display the normal view --> 
{% endif %} 

Oder es von der Steuerung:

if (!is_object($this->get('security.token_storage')->getToken()->getUser())) { 
    // Render the login form 
} 

So können Sie Ihre Logik abhängig davon machen, ob der Benutzer authentifiziert ist oder nicht.

+0

In Anbetracht der Tatsache, dass der Benutzer auf die Panel-Seite zugreifen möchte und er auf eine Seite weitergeleitet wird, wo ich das Login-Formular anzeigen (mit Ajax genommen und validiert), woher weiß ich, welche Seite den Benutzer nach der Anmeldung (in diesem Fall Seite) umleiten und woher weiß ich, ob der Benutzer sich ursprünglich anmelden wollte oder nicht (das Login-Formular ist modal und der Inhalt wird mit Ajax abgerufen)? –

+0

In Ihrer Frage sagen Sie, dass Sie den Benutzer nicht umleiten wollen, zeigen Sie nur das Login-Formular an. Um zu wissen, auf welche Seite Ihr Benutzer zugreifen möchte, verwenden Sie 'app.request.headers.get ('referer')' aus Zweig oder '$ this-> getRequest() -> headers-> get ('referer')' vom Controller . Wenn Sie nach der Anmeldung an den Referer weiterleiten möchten, fügen Sie einen '_target_path' als Formularfeld hinzu, füllen Sie ihn mit dem abgerufenen Referer und führen Sie die Umleitung in der Methode aus, die Ihr Formular behandelt (wenn Ihr Formular von FOSUser behandelt wird,' _target_path 'wird automatisch verwendet). Ich kann eine schnelle Bearbeitung machen, wenn Sie ein Beispiel benötigen. – chalasr

+0

Gute Idee, werde ich tun. –

Verwandte Themen