2016-07-26 24 views
0

Ich baue eine Flask-App, die Stormpath und Flask-Stormpath für auth verwendet. Ich möchte verhindern, dass ein eingeloggter Benutzer auf die Seiten/login oder/register zugreift (da dies wenig Sinn macht - ein angemeldeter Benutzer muss sich nicht anmelden und Sie sind per Definition registriert, wenn Sie bereits eingeloggt sind). Ich habe eine Lösung in meiner benutzerdefinierten Login-Seite Vorlage versuchte, etwas entlang der Linien zu tun:Wie kann man angemeldete Benutzer daran hindern, mit Flask-Stormpath auf Login-/Registerseiten zuzugreifen?

{% block page_heading %} 

    {% if user.given_name %} 
     Already Logged in as {{ user.given_name }} 
    {% else %} 
     Enter your credentials 
    {% endif %} 

{% endblock page_subheading %} 

Wenn ein Benutzer zur Zeit angemeldet ist, wird user.given_name definiert werden und der page_heading Block der ‚nimmt bereits angemeldet in 'Nachricht' und andernfalls 'Nachricht eingeben' (im Normalfall, wenn ein nicht authentifizierter Benutzer versucht, sich anzumelden). Ich benutze das gleiche Konstrukt, um das Login-Formular oder mehr Fehlertext anzuzeigen. Dieser Versuch funktioniert jedoch nicht: es ist so, als ob benutzer.given_name immer auf undefiniert zurückkehrt, wenn ein angemeldeter Benutzer sich anmeldet/anmeldet. Dies bedeutet, dass, wenn jemand eingeloggt ist und sich anmeldet, sie abgemeldet werden - dies würde den Fehler meines Lösungsversuchs erklären.

Angesichts der oben genannten und nach Konsultation der Dokumente, könnte ich in der Lage sein zu verwenden is_authenticated(); nicht durch Flask-Stormpath, sondern durch das zugrundeliegende Flask-Login-Modul, da Flask-Stormpath dies immer auf True setzt, nach den Dokumenten, aber ich habe keine Ahnung, wie ich das anstellen soll.

Darüber hinaus ist mein Ansatz hacky - ich denke, eine bessere Lösung würde in der Python-Seite der App liegen.

Also meine Frage ist das: Was ist die sinnvollste Art und Weise zu erkennen, ein Benutzer ist angemeldet und damit verhindert, dass sie auf die/Login und/Register-Seiten zugreifen oder umleiten sie? Vielleicht gibt es einen magischen Dekorateur irgendwo, dass das Gegenteil

@login_required 

oder ein stormpath eingebauten ‚unerlaubt‘ Gruppe

ist, dass ich wie in

@groups_required(['unauthorised']) 

verwenden könnte Oder vielleicht habe ich auf dem rechten Seite war Linien mit meinem ursprünglichen Versuch.

Jede Hilfe ist willkommen :)

+0

Update: Ich habe gerade versucht, meinen ursprünglichen Ansatz (die Vorlage basierende Lösung) mit der/Registerseite und bekam die gewünschtes Verhalten. Die Dinge funktionieren immer noch nicht für/login. Es wird immer wahrscheinlicher, dass wenn ein angemeldeter Benutzer sich anmeldet/anmeldet, diese abgemeldet werden und dann die Anmeldeseite angezeigt wird. Nicht sicher, wie man damit umgeht –

Antwort

0

Sie erstellen ein decorator den Code enthält. Es wird angemeldete Benutzer auf eine andere Seite umleiten, wenn sie versuchen, auf die Anmeldeseite zuzugreifen.

if current_user.is_authencticated(): 
    return redirect (url_for('home')) 
+0

Hey, danke fürs Beantworten. Wohin würde dieser Code genau gehen? Bei flash-stormpath sind die View-Funktionen für/login und/register intern in der Bibliothek. –

+0

in einem Dekorateur, lassen Sie mich bearbeiten. – roy

+0

Prost, ich schätze die Hilfe –

1

Heyo!

Also, ich bin der Autor von Flask-Stormpath, ich dachte, ich würde hier reinspringen. Anstatt zu versuchen, das Verhalten von login/register zu ändern (was ich nicht empfehlen würde, da wir das regelmäßig mit Bibliotheks-Releases ändern), ist eine bessere Lösung, diese URLs einfach vor dem Benutzer auszublenden, sobald sie sich angemeldet haben.

Viele Websites haben zum Beispiel eine Top Navbar, die irgendwo "Login" und "Register" sagt. Sobald Sie sich jedoch angemeldet haben, ändern sich diese Schaltflächen in etwas anderes, normalerweise "Dashboard" oder ähnliches.

Auf diese Weise kann ein Benutzer nicht zu/login oder/register gehen, wenn er nicht explizit in den Browser eintippt und versucht, manuell dorthin zu gelangen.

Ich denke, das das ideale Szenario, das Sie erreichen können Template bedingte Logik verwendet:

{% if user %} 
... 
{% else %} 
... 
{% endif %} 
+0

Hey! Ich habe dies getan - es gibt keine Möglichkeit für einen angemeldeten Benutzer Zugriff auf/Login oder/aus meiner App zu registrieren. Es war der Fall, dass sie sich manuell in die Adresszeile einloggen/einloggen, auf die ich mich in meiner Frage bezog. Tut mir leid, ich hätte das in meiner Frage erwähnen sollen! –

+0

Große Bibliothek übrigens –