Flask ist ein auf Python basierendes Micro-Web-Framework, mit dem Sie Ihre Webanwendungen schnell und effizient schreiben können. Mikro bedeutet nicht, dass Flask an Funktionalität fehlt. Es bezieht sich lediglich auf die Tatsache, dass Flask seinen Kern klein und stark dehnbar gehalten hat.
LDAP (Lightweight Directory Access Protocol) kann je nach Verwendung für verschiedene Personen unterschiedliche Bedeutungen haben. Es handelt sich um ein Internetprotokoll, um Kontaktinformationen zu Benutzern, Informationen zu Zertifikaten, Netzwerkzeiger usw. von einem Server abzurufen, auf dem die Daten in einer Verzeichnisstilstruktur gespeichert sind. Die häufigste Verwendung ist die Bereitstellung einer "Single Sign-On", bei der ein Benutzer auf mehrere Anwendungen zugreifen kann, indem er sich einmal anmeldet, da das Kennwort von mehreren Diensten gemeinsam genutzt wird.
In diesem Lernprogramm werde ich Sie durchführen, wie Sie die Authentifizierung von Benutzern in Ihrer Flask-Anwendung mithilfe von LDAP implementieren. Um dies zu demonstrieren, werde ich eine kleine Anwendung mit einer Homepage und einer Anmeldeseite erstellen. Der Benutzer muss die Anmeldedaten auf der Anmeldeseite eingeben. Wenn die vom Benutzer eingegebenen Anmeldeinformationen erfolgreich auf dem bereitgestellten LDAP-Server authentifiziert wurden, wird der Benutzer angemeldet. Wenn dies nicht der Fall ist, wird dem Benutzer eine entsprechende Meldung angezeigt.
Ich gehe davon aus, dass Sie über grundlegende Kenntnisse in Bezug auf Flask, LDAP, Flask-Login-Erweiterung und bewährte Vorgehensweisen zum Einrichten von Umgebungen mit virtualenv verfügen, die bei der Entwicklung einer Python-Anwendung zu beachten sind.
Die folgenden Pakete müssen für die Anwendung, die wir entwickeln, installiert werden.
$ pip install python-ldap $ pip install flask-wtf flask-sqlalchemy flask-login
Die obigen Befehle sollten alle erforderlichen Pakete installieren, die für diese Anwendung erforderlich sind.
Zunächst muss die Anwendung so strukturiert sein, dass sie leicht verständlich ist.
flask_app / my_app / - __init__.py auth / - __init__.py - models.py - views.py statisch / - css / - js / templates / - base.html - home.html - login.html - run.py
Alle Dateien werden unten beschrieben. Das statisch
Ordner enthält die Standard-Bootstrap-CSS- und -JS-Dateien.
Zuerst muss die Konfigurationsdatei geschrieben werden:
importflask from flask.ext.sqlalchemy importieren SQLAlchemy aus flask.ext.login import LoginManager app = Flask (__ name__) app.config ['SQLALCHEMY_DATABASE_URI'] = 'sqlite: ////tmp/test.db'. config ['WTF_CSRF_SECRET_KEY'] = 'Zufallsschlüssel für Formular' app.config ['LDAP_PROVIDER_URL'] = 'ldap: //ldap.testathon.net: 389 /' app.config ['LDAP_PROTOCOL_VERSION'] = 3 db = SQLAlchemy app) app.secret_key = 'some_random_key' login_manager = LoginManager () login_manager.init_app (app) login_manager.login_view = 'login' von my_app.auth.views import auth app.register_blueprint (auth) db.create_all ()
In der obigen Datei wurde die Anwendung mit verschiedenen Optionen konfiguriert, die von den Erweiterungen sowie von der LDAP-Konfiguration benötigt werden. Es folgt die Initialisierung der Erweiterungen und schließlich die Erstellung der Datenbank.
Die letzte Anweisung erstellt eine neue Datenbank am angegebenen Ort SQLALCHEMY_DATABASE_URI
Wenn an diesem Ort noch keine Datenbank vorhanden ist, lädt die Anwendung andernfalls dieselbe Datenbank.
ldap aus flask_wtf import importieren Formular aus wtforms importieren TextField importieren, PasswordField aus wtforms.validators importieren InputRequired aus my_app import db, app def get_ldap_connection (): conn = ldap.initialize (app.config ['LDAP_PROVIDER_URL']) .Model): id = db.Column (db.Integer, primary_key = True) username = db.Column (db.String (100)) def __init __ (selbst, Benutzername, Kennwort): self.username = username @staticmethod def try_login (Benutzername, Kennwort): conn = get_ldap_connection () conn.simple_bind_s ('cn =% s, ou = Benutzer, dc = testathon, dc = net'% Benutzername, Kennwort) def is_authenticated (self): Rückgabe True def is_active (self ): return True def is_anonymous (self): return False def get_id (self): return Unicode (self.id) Klasse LoginForm (Formular): Benutzername = TextField ('Benutzername', [InputRequired ())) Passwort = PasswordField (') Passwort ', [InputRequired ()])
Die Datei beginnt mit der Erstellung eines Nutzer
Modell, das nur eine enthält Nutzername
Feld zu Demonstrationszwecken. Sie können je nach Kontext der Anwendung beliebig viele Felder hinzufügen.
Die Methoden is_authenticated ()
, ist aktiv()
, is_anonymous ()
und get_id ()
werden von der Flask-Login-Erweiterung benötigt. Das try_login ()
Diese Methode führt den eigentlichen Authentifizierungsprozess durch, indem zuerst eine Verbindung mit dem LDAP-Server hergestellt wird und dann der Benutzername und das Kennwort zum Anmelden beim Server verwendet werden, indem eine einfache Bindung erstellt wird.
Das erste Argument der simple_bind_s ()
Die Methode ist der DN, der vom LDAP-Server bereitgestellt wird und von der LDAP-Datensatzkonfiguration abhängt. Die Formularabwicklung übernimmt das Login Formular
, das erstreckt sich der Bilden
Klasse bereitgestellt von Flask-WTForms.
'ldap aus Flasche importieren importieren, render_template, flash, umleiten, \ url_for, Blueprint, g aus flask.ext.login importieren current_user, login_user, \ logout_user, login_required aus my_app import login_manager, db aus my_app.auth.models import User, LoginForm auth = Blueprint ('auth', __name__) @ login_manager.user_loader def load_user (id): Rückgabe User.query.get (int (id)) @ auth.before_request def get_current_user (): g.user = current_user @auth. route ('/') @ auth.route ('/ home') def home (): return render_template ('home.html') @ auth.route ('/ login', method = ['GET', 'POST') ]) def login (): if current_user.is_authenticated (): flash ('Sie sind bereits angemeldet.') geben die Weiterleitung zurück (url_for ('auth.home')) form = LoginForm (request.form) wenn request.method = = 'POST' und form.validate (): username = request.form.get ('username') password = request.form.get ('password') try: User.try_login (Benutzername, Passwort) außer ldap.INVALID_CREDENTIALS: flash ('Ungültiger Benutzername oder Passwort. Bitte erneut versuchen.', 'gefahr' ) render_template ('login.html', form = form) zurückgeben user = User.query.filter_by (Benutzername = Benutzername) .first (), falls nicht Benutzer: Benutzer = Benutzer (Benutzername, Kennwort) db.session.add (Benutzer) db.session.commit () login_user (user) flash ('Sie haben sich erfolgreich angemeldet.', 'success') geben die Weiterleitung zurück (url_for ('auth.home')), wenn form.errors: flash (form.errors, ' danger ') return render_template (' login.html ', form = form) @ auth.route (' / logout ') @login_required def logout (): logout_user () return umleiten (url_for (' auth.home '))
In der obigen Datei die Methoden load_user ()
und get_current_user ()
werden von Flask-Login Erweiterung benötigt. Als nächstes sind die Handler für unsere Anwendung, die durch ihre jeweiligen Routen dekoriert sind.
Zuhause()
rendert einfach die Homepage für den Benutzer. Der Inhalt der Homepage wird von der Vorlage bestimmt flask_app / meine_app / templates / home.html
, das werden wir in Kürze besprechen.
Der Handler von primärem Interesse ist Anmeldung()
wie es den kompletten Anmeldeprozess abwickelt. Wenn ein angemeldeter Benutzer versucht, auf diese Seite zuzugreifen, wird die Seite automatisch auf die Startseite umgeleitet. Andernfalls beginnt der Anmeldeprozess, wobei der LDAP-Benutzername und das Kennwort des Benutzers als Formulareingabe verwendet werden flask_app / meine_app / templates / login.html
.
Mit diesen Anmeldeinformationen versucht die Anwendung, den Benutzer über den LDAP-Server zu authentifizieren, der in der zuvor angegebenen Konfiguration angegeben wurde. Wenn der Benutzer authentifiziert ist, erstellt die Anwendung einen neuen Datensatz für den Benutzer, wenn ein Benutzer zum ersten Mal auf die Anwendung zugreift. Andernfalls meldet er den Benutzer nur mit dem vorhandenen Datensatz des Benutzers an.
Flash-Nachrichten werden dem Benutzer bei Bedarf angezeigt, um ihn mit der Anwendung in Verbindung zu halten.
Ausloggen()
hander löscht einfach die Sitzung des aktuell angemeldeten Benutzers, wodurch der Benutzer abgemeldet wird.
Flaschenauthentifizierung mit LDAP-Lernprogramm % block scripts% % endblock%
% für category, Nachricht in get_flashed_messages (with_categories = true)%% block container% % endblock%Botschaft% endfor%
Oben befindet sich die Basisdatei, die die Kopf- und Fußzeile sowie andere grundlegende Komponenten enthält, die in der gesamten Anwendung verwendet werden. Dies hilft dabei, die Vorlagen sehr modular und leicht verständlich zu halten, da jede Vorlage nur den für ihren Handler und ihre Funktionalität relevanten Code enthält.
Obwohl alle gemeinsamen Komponenten hier definiert sind, habe ich einen leeren Block für hinzugefügt Skripte
die in jeder Vorlage, die erbt, erweitert werden kann base.html
. Beachten Sie, wie das Flashen von Nachrichten oben ausgeführt wird und wie die Bootstrap-CSS-Klassen dynamisch abgespielt werden, um das Benachrichtigungsfeld für Flash-Nachrichten entsprechend zu gestalten.
Das Container
Der Block wird um die restlichen Vorlagen erweitert, um deren jeweiligen Inhalt hinzuzufügen.
% erweitert 'base.html'% % Blockcontainer%Willkommen bei der Flask-LDAP-Authentifizierungsdemo
% if current_user.is_authenticated ()%Hey current_user.username!!
Klicken Sie hier, um sich abzumelden % else% Klicken Sie hier, um sich mit LDAP anzumelden % endif% % endblock%
Beachten Sie, wie die Basisvorlage erweitert wurde und der Inhalt der Homepage innerhalb des Blockcontainers hinzugefügt wurde.
Wenn der Benutzer angemeldet ist, wird der Benutzer mit dem Benutzernamen begrüßt und eine Meldung zum Abmelden angezeigt. Andernfalls wird dem Benutzer eine Meldung mit dem Link zur Anmeldeseite angezeigt.
% erweitert 'home.html'% % Blockcontainer%% endblock%
Die Login-Vorlage enthält lediglich ein Formular mit Feldern für Nutzername
und Passwort
.
Führen Sie das Skript aus, um die Anwendung auszuführen run.py
. Der Inhalt dieses Skripts ist:
von my_app import app app.run (debug = True)
Jetzt einfach von der Kommandozeile aus ausführen:
Python run.py
Öffnen Sie schließlich http://127.0.0.1:5000/ in Ihrem bevorzugten Browser und sehen Sie Ihre Anwendung in Aktion. Alles sollte selbsterklärend sein. Für die Anmeldung können Sie die folgenden Anmeldeinformationen verwenden:
Ich habe den von Stuart Lewis aufgestellten Testathon-Server benutzt.
Im Verlauf dieses Tutorials haben wir mithilfe von Flask eine kleine, aber effektive Webanwendung mithilfe der Erweiterung Flask-Login entwickelt. Diese Anwendung verwendet einfach einen Benutzernamen und ein Kennwort und authentifiziert den Benutzer anhand des bereitgestellten LDAP-Servers. Nutzen Sie Ihre Vorstellungskraft, um die Anwendung Ihren Bedürfnissen entsprechend anzupassen und zu erweitern.