Django-Highlights: Benutzermodelle und Authentifizierung (Teil 1)

Veröffentlicht: 2022-03-10
Kurze Zusammenfassung ↬ Ein Hauptgrund für die Entwicklung einer dynamischen Website ist die Authentifizierung von Benutzern und die Einschränkung von Inhalten. Django bietet ein leistungsstarkes, sofort einsatzbereites Benutzermodell, und in diesem Artikel zeigen wir Ihnen, wie Sie am besten sichere, intuitive Benutzerauthentifizierungsabläufe bereitstellen.

Es gibt zwei Arten von Websites: statische und dynamische. Django ist ein Framework zur Entwicklung dynamischer Websites. Während eine statische Website nur Informationen präsentiert, gibt es keine Interaktion (über einfache Seitenanfragen hinaus), die auf einem Server registriert wird. Bei einer statischen Website sendet der Server HTML, CSS und JavaScript an einen Client, und das war's. Mehr Funktionen erfordern eine dynamische Website, auf der der Server Informationen speichert und auf Benutzerinteraktionen reagiert, die über das bloße Bereitstellen von Seiten hinausgehen. Einer der Hauptgründe für die Entwicklung einer dynamischen Website ist die Authentifizierung von Benutzern und die Einschränkung von Inhalten.

Das Schreiben, Bereitstellen und Verwalten einer statischen Website ist um eine Größenordnung einfacher, billiger und sicherer als eine dynamische Website. Daher sollten Sie nur dann eine dynamische Website erstellen, wenn die zusätzlichen Fähigkeiten des dynamischen Paradigmas für Ihr Projekt erforderlich sind. Django vereinfacht und rationalisiert den Prozess der Erstellung einer dynamischen Website mit seinen integrierten Komponenten. Als eine der Hauptkomponenten einer dynamischen Webanwendung ist das „Benutzerkonto“-Objekt wie das Rad verlockend, es neu zu erfinden, aber die Standardform ist für die meisten Anwendungen geeignet. Django bietet ein leistungsstarkes, sofort einsatzbereites Benutzermodell, und in diesem Artikel zeigen wir Ihnen, wie Sie am besten sichere, intuitive Benutzerauthentifizierungsabläufe bereitstellen.

Weitere Teile der Reihe:

  • Django-Highlights: Templating speichert Zeilen (Teil 2)
  • Django-Highlights: Modelle, Verwaltung und Nutzung der relationalen Datenbank (Teil 3)
  • Django-Highlights: Umgang mit statischen Assets und Mediendateien (Teil 4)

Einrichten

Wenn Sie Ihre eigene Django-Anwendung erstellen möchten, um mit den Konzepten in diesem Artikel zu experimentieren, können Sie ein Verzeichnis (und vorzugsweise eine virtuelle Umgebung) erstellen und dann die folgenden Befehle ausführen:

 pip install django django-admin startproject PROJECTNAME cd PROJECTNAME python manage.py startapp APPNAME python manage.py migrate python manage.py runserver

Wenn Sie nach einer Anleitung zum Erstellen Ihres ersten Django-Projekts suchen, bietet Djangos eigene Website eine großartige Anleitung. In diesem Artikel verwenden wir kein Beispielprojekt, aber die besprochenen Konzepte gelten für fast jede Django-Anwendung.

Mehr nach dem Sprung! Lesen Sie unten weiter ↓

Standardbenutzermodell

Grundsätzlich existiert das Konzept eines Benutzerkontos aus zwei Gründen: Zugriffskontrolle und personalisierter Anwendungsstatus. Zugriffskontrolle ist die Idee, dass Ressourcen auf einem System nur einigen Benutzern zur Verfügung stehen. Der personalisierte Status hängt stark vom Zweck der Anwendung ab, kann jedoch Einstellungen, Daten oder andere Aufzeichnungen enthalten, die für einen einzelnen Benutzer spezifisch sind. Das Stock User -Modell von Django bietet sinnvolle Ansätze für beide Anwendungsfälle.

Anfänglich gibt es zwei Arten von Benutzern in einer Django-Anwendung: Superuser-Konten und normale Benutzer. Superuser haben alle Attribute und Privilegien regulärer Konten, haben aber auch Zugriff auf das Django-Admin-Panel, eine leistungsstarke Anwendung, die wir in einem zukünftigen Artikel ausführlich untersuchen werden. Im Wesentlichen können Superuser alle Daten in der Anwendung erstellen, bearbeiten oder löschen, einschließlich anderer Benutzerkonten.

Grundsätzlich existiert das Konzept eines Benutzerkontos aus zwei Gründen: Zugriffskontrolle und personalisierter Anwendungsstatus.

Um einen Superuser für Ihre eigene Django-Anwendung zu erstellen, führen Sie Folgendes aus:

 python manage.py createsuperuser

Der andere Vorteil eines Benutzerkontos ist das Speichern personalisierter Daten in der Datenbank. Standardmäßig erfordert Django nur einen Benutzernamen und ein Passwort, bietet jedoch optionale Felder, in die Benutzer ihren Vornamen, Nachnamen und ihre E-Mail-Adresse eingeben können. Eine vollständige Modellreferenz finden Sie auf der Django-Website. Wir werden die Erweiterung dieses Modells weiter unten besprechen.

Sicherheit und Zuverlässigkeit

Django enthält im Benutzermodell umfangreiche Middleware für die Kennwortverwaltung. Benutzerpasswörter müssen mindestens 8 Zeichen lang sein, dürfen nicht vollständig aus Zahlen bestehen, dürfen nicht zu genau mit dem Benutzernamen übereinstimmen und dürfen nicht auf einer Liste der 20.000 häufigsten Passwörter stehen. Die Bestandsformulare von Django validieren diese Anforderungen. Wenn ein Passwort an den Server gesendet wird, wird es verschlüsselt, bevor es gespeichert wird, standardmäßig unter Verwendung des PBKDF2-Algorithmus mit einem SHA256-Hash. Insgesamt bietet das Standard-Passwortsystem robuste Sicherheit ohne jeglichen Aufwand des Entwicklers. Ändern Sie dieses Verhalten nicht, es sei denn, Sie verfügen über spezielle Fachkenntnisse und einen zwingenden Grund, die Art und Weise zu ändern, wie Kennwörter in Ihrer Anwendung verarbeitet werden.

Eine weitere bequeme integrierte Funktion ist die Anforderung, dass Benutzernamen eindeutig sein müssen. Wenn Sie darüber nachdenken, wenn es zwei Benutzer mit dem Benutzernamen „djangofan1“ gäbe und der Server eine Anmeldeanfrage für diesen Benutzernamen erhalten würde, würde er nicht wissen, welcher Benutzer versucht, auf die Anwendung zuzugreifen. Unglücklicherweise muss der zweite Benutzer, der versucht, sich bei „djangofan1“ zu registrieren, einen anderen Namen wählen, vielleicht „djangofan2“. Diese Eindeutigkeitsbeschränkung wird auf Datenbankebene durchgesetzt, aber erneut durch die von Django bereitgestellten Formulare verifiziert.

Abschließend noch ein Hinweis zum Löschen von Benutzern. Während das Löschen von Benutzern möglich ist, sind bei den meisten komplexen Anwendungen eine Reihe von Ressourcen an jedes Benutzerkonto gebunden. Wenn Sie einen Benutzer effektiv löschen möchten, ohne diese angehängten Objekte zu entfernen, setzen Sie stattdessen das is_active -Feld des Benutzers auf false. Dann bleiben diese anderen Ressourcen mit dem Konto verbunden, anstatt selbst gelöscht zu werden, und das Benutzerkonto kann jederzeit von einem Superuser reaktiviert werden. Beachten Sie, dass der Benutzername dadurch nicht freigegeben wird, aber das Deaktivieren des Kontos in Verbindung mit dem Ändern des Benutzernamens in einen zufälligen, eindeutigen Wert könnte den gleichen Effekt erzielen. Wenn Ihre Site-Richtlinien oder geltende lokale Gesetze verlangen, dass Benutzerkonten vollständig löschbar sind, ist der is_active Ansatz schließlich nicht ausreichend.

Ändern Sie dieses Verhalten nicht, es sei denn, Sie verfügen über spezielle Fachkenntnisse und einen zwingenden Grund, die Art und Weise zu ändern, wie Kennwörter in Ihrer Anwendung verarbeitet werden.

Standardnutzung

Wenn Sie ein neues Benutzerkonto registrieren möchten, sieht die Ansicht dafür in views.py wahrscheinlich in etwa so aus:

 from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.contrib.auth.forms import UserCreationForm def signup(request): if request.user.is_authenticated: return redirect('/') if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): form.save() username = form.cleaned_data.get('username') password = form.cleaned_data.get('password1') user = authenticate(username=username, password=password) login(request, user) return redirect('/') else: return render(request, 'signup.html', {'form': form}) else: form = UserCreationForm() return render(request, 'signup.html', {'form': form})

Lassen Sie uns das aufschlüsseln:

  • Wenn der Benutzer bereits angemeldet ist, leiten wir ihn von der Anmeldeseite weg.
  • Wenn die Anforderungsmethode POST ist, bedeutet dies, dass das Formular zum Erstellen eines Benutzers bereits ausgefüllt wurde und es an der Zeit ist, einen Benutzer zu erstellen.
    • Erstellen Sie zunächst das Formularobjekt im Backend mit den vom Benutzer bereitgestellten Daten.
    • Wenn das Formular gültig ist, erstellen Sie den Benutzer, melden Sie ihn an und senden Sie ihn dann an die Hauptseite.
    • Geben Sie sie andernfalls auf der Seite zur Benutzererstellung mit Informationen darüber zurück, welche Daten ungültig waren (z. B. sie haben einen bereits verwendeten Benutzernamen angefordert).
  • Andernfalls greift der Benutzer zum ersten Mal auf die Seite zu und sollte mit dem Formular zum Erstellen eines neuen Kontos konfrontiert werden.

Untersuchen Sie jetzt die Kontoanmeldung:

 from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login from django.contrib.auth.forms import AuthenticationForm def signin(request): if request.user.is_authenticated: return render(request, 'homepage.html') if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('/') else: form = AuthenticationForm(request.POST) return render(request, 'signin.html', {'form': form}) else: form = AuthenticationForm() return render(request, 'signin.html', {'form': form})

Noch eine Aufschlüsselung:

  • Wenn der Benutzer bereits angemeldet ist, leiten wir ihn von der Anmeldeseite weg.
  • Wenn die Anforderungsmethode POST ist, bedeutet dies, dass das Anmeldeformular ausgefüllt wurde und es an der Zeit ist, den Benutzer bei einem Konto zu authentifizieren.
    • Authentifizieren Sie zunächst den Benutzer mit den vom Benutzer bereitgestellten Daten
    • Wenn der Benutzername und das Passwort einem Konto entsprechen, melden Sie den Benutzer an
    • Bringen Sie sie andernfalls mit vorausgefüllten Formularinformationen zur Anmeldeseite zurück
  • Andernfalls greift der Benutzer zum ersten Mal auf die Seite zu und sollte auf das Formular zum Anmelden treffen.

Schließlich möchten sich Ihre Benutzer möglicherweise abmelden. Der grundlegende Code für diese Anfrage ist einfach:

 from django.shortcuts import render, redirect from django.contrib.auth import logout def signout(request): logout(request) return redirect('/')

Sobald sich der Benutzer bei seinem Konto angemeldet hat und bis er sich auf diesem Gerät abmeldet, hat er eine „Sitzung“. Während dieser Zeit können nachfolgende Anfragen von ihrem Browser auf reine Kontoseiten zugreifen. Ein Benutzer kann mehrere Sitzungen gleichzeitig aktiv haben. Standardmäßig wird für Sitzungen kein Timeout ausgeführt.

Während ein Benutzer eine aktive Sitzung auf seinem Gerät hat, wird er für die Prüfung request.user.is_authenticated “ als „ True “ registriert. Eine weitere Möglichkeit, Seiten nur auf angemeldete Benutzer zu beschränken, ist der Decorator @login_required über einer Funktion. Es gibt mehrere andere Möglichkeiten, dasselbe zu erreichen, die hier beschrieben werden.

Wenn diese Konfigurationsebene mehr ist, als Sie ausführen möchten, gibt es einen noch Out-of-the-Box-Ansatz für die Benutzerverwaltung. Diese Bestandsauthentifizierungsansichten bieten Standardrouten, Ansichten und Formulare für die Benutzerverwaltung und können geändert werden, indem sie benutzerdefinierten URLs zugewiesen, benutzerdefinierte Vorlagen übergeben oder sogar die Ansichten für mehr Kontrolle in Unterklassen unterteilt werden.

Erweiterung des Benutzermodells

Im Allgemeinen müssen Sie das Benutzermodell erweitern, um eine differenziertere Zugriffskontrolle bereitzustellen oder mehr Benutzerdaten pro Konto zu speichern. Wir werden unten einige häufige Fälle untersuchen.

Löschen von Feldern aus dem Benutzermodell

Im Gegensatz zur Überschrift dieses Abschnitts empfehle ich eigentlich nicht, Änderungen direkt am Benutzermodell oder dem zugehörigen Datenbankschema vorzunehmen! Das generische Benutzermodell wird standardmäßig während der Einrichtung eines neuen Django-Projekts in Ihrer Datenbank eingerichtet. So viel ist an das Standardbenutzermodell gebunden, dass eine Änderung unerwartete Auswirkungen auf Ihre Anwendung haben könnte (insbesondere, wenn Sie Bibliotheken von Drittanbietern verwenden). Dementsprechend wird das Hinzufügen oder Entfernen von Feldern nicht empfohlen und durch das Framework nicht erleichtert.

Standardmäßig sind Benutzername und Kennwort die einzigen beiden Felder, die für einen Benutzer erforderlich sind. Wenn Sie keines der anderen Felder verwenden möchten, ignorieren Sie einfach deren Vorhandensein, da ein Benutzer ohne Vorname, Nachname oder E-Mail-Adresse erstellt werden kann. Es gibt eine Sammlung von Standardfeldern wie last_login und date_joined, die auch ignoriert werden können, wenn Sie dies nicht möchten. Wenn Sie eine tatsächliche technische Einschränkung hätten, die das Löschen optionaler Felder aus dem Benutzermodell erfordert, wüssten Sie bereits davon und würden diesen Artikel nicht benötigen.

Ein häufiger Grund, warum Sie ein Feld im Benutzermodell löschen möchten, besteht darin, den Benutzernamen zugunsten der E-Mail als eindeutigen Bezeichner zu löschen. Geben Sie in diesem Fall beim Erstellen des Benutzers aus Formulardaten oder beim Authentifizieren einer Anfrage einfach die E-Mail-Adresse als Benutzernamen zusätzlich zu ihrer Verwendung im E-Mail-Feld ein. Das Benutzernamenfeld erzwingt weiterhin die Eindeutigkeitsbeschränkung, wenn Benutzernamen als E-Mail-Adressen formatiert sind. Strings sind Strings, sie werden gleich behandelt.

So viel ist an das Standardbenutzermodell gebunden, dass eine Änderung unerwartete Auswirkungen auf Ihre Anwendung haben könnte, insbesondere wenn Sie Bibliotheken von Drittanbietern verwenden.

Hinzufügen von Feldern mit einem Profil

Wenn Sie zusätzliche Informationen über Ihre Benutzer speichern möchten, sollten Sie nicht versuchen, das Standardbenutzermodell zu ändern. Definieren Sie selbst für ein einzelnes Feld Ihr eigenes Objekt mit einer Eins-zu-eins-Beziehung zu den vorhandenen Benutzern. Dieses zusätzliche Modell wird oft als Profile bezeichnet. Angenommen, Sie möchten für jeden Benutzer einen zweiten Vornamen und ein Geburtsdatum (dob) speichern. Das Profile würde in models.py wie folgt definiert:

 from django.db import models from django.contrib.auth.models import User class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) middle_name = models.CharField(max_length=30, blank=True) dob = models.DateField(null=True, blank=True)

Benutzerdefinierte Zugriffskontrolle

Ihre Anwendung erfordert möglicherweise eine Unterscheidung zwischen verschiedenen Arten von Benutzern für den Zugriff auf Informationen und Funktionen. Django bietet ein System zum Erstellen einer benutzerdefinierten feinkörnigen Zugriffskontrolle: Berechtigungen und Gruppen.

Berechtigungen sind Objekte, die den Zugriff auf Ressourcen bestimmen. Ein Benutzer kann eine oder mehrere Berechtigungen haben. Beispielsweise könnten sie Lesezugriff auf eine Produkttabelle und Schreibzugriff auf eine Kundentabelle haben. Die genaue Implementierung von Berechtigungen variiert je nach Anwendung erheblich, aber der Ansatz von Django macht es intuitiv, Berechtigungen für Daten zu definieren und diese Berechtigungen Benutzern zuzuweisen.

Anwendungen für Unternehmen und andere große Organisationen implementieren häufig eine rollenbasierte Zugriffskontrolle. Grundsätzlich kann ein Benutzer verschiedene Rollen haben, die jeweils bestimmte Berechtigungen haben. Djangos Werkzeug zur Implementierung dieses Musters ist die Gruppe. Eine Gruppe kann beliebig viele Berechtigungen haben, die jeweils beliebig vielen Gruppen zugeordnet werden können. Ein Benutzer erhält dann Berechtigungen nicht direkt, sondern durch seine Mitgliedschaft in Gruppen, wodurch die Anwendung einfacher zu verwalten ist.

Überblick: Integration eines Zahlungsanbieters

Der genaue Prozess der Integration eines Zahlungsabwicklers ist je nach Anwendung und Anbieter sehr unterschiedlich. Ich werde den Prozess jedoch allgemein behandeln.

Einer der Hauptvorteile des Outsourcings von Zahlungen besteht darin, dass der Anbieter für die Speicherung und Validierung streng regulierter Daten wie Kreditkarteninformationen verantwortlich ist. Der Dienst teilt dann einige eindeutige Benutzertoken mit Ihrer Anwendung zusammen mit Daten über deren Zahlungsverlauf. Wie beim Hinzufügen des Profils können Sie ein Modell erstellen, das dem User zugeordnet ist, und die Daten in diesem Modell speichern. Wie bei Passwörtern ist es wichtig, die angegebene Integration mit dem Anbieter zu befolgen, um zu vermeiden, dass vertrauliche Informationen unsachgemäß gespeichert werden.

Übersicht: Social-Sign-In

Das andere breite, komplexe Feld, das ich kurz ansprechen möchte, ist die soziale Anmeldung. Große Plattformen wie Facebook und Google sowie kleinere Websites wie GitHub bieten APIs für die Nutzung ihrer Dienste zur Authentifizierung von Benutzern. Ähnlich wie bei einem Zahlungsanbieter erstellt dies einen Datensatz in Ihrer Datenbank, der ein Konto mit einem Konto in seiner Datenbank verknüpft.

Möglicherweise möchten Sie die soziale Authentifizierung in Ihre Website integrieren, um es Benutzern zu erleichtern, sich anzumelden, ohne einen neuen Satz Anmeldedaten zu erstellen. Wenn Ihre Anwendung ausschließlich auf Kunden abzielt, die bereits eine bestimmte Website verwenden, die eine soziale Authentifizierungsoption bietet, kann sie Ihnen helfen, Benutzer aus diesem Markt zu gewinnen, indem sie die Eintrittsbarriere senkt. Wenn Ihre Anwendung außerdem beabsichtigt, auf die Daten des Benutzers von einem Drittanbieterdienst zuzugreifen, vereinfacht das Verknüpfen der Konten während der Authentifizierung den Prozess der Erteilung von Berechtigungen.

Es gibt jedoch Nachteile bei der Verwendung von Social Auth. API-Änderungen oder Ausfälle des Drittanbieters können die Betriebszeit oder die Entwicklungsaktivitäten Ihrer Anwendung unterbrechen. Im Allgemeinen erhöhen externe Abhängigkeiten die Komplexität der Anwendung. Schließlich lohnt es sich, die Datenerfassungs- und Nutzungsrichtlinien von Drittanbietern zu berücksichtigen, die Sie integrieren, und sicherzustellen, dass sie Ihren Erwartungen und denen Ihrer Benutzer entsprechen.

Wenn Sie sich entscheiden, dass die soziale Authentifizierung für Ihre Anwendung geeignet ist, gibt es glücklicherweise eine Bibliothek dafür. Python Social Auth for Django ist ein Paket zur Aktivierung der Funktionen des Ökosystems für soziale Authentifizierung von Python in Django-Projekten.

Einpacken

So universell das Benutzerkonto auch ist, seine weite Verbreitung kann dazu führen, dass dieselben Probleme unnötigerweise gelöst werden. Hoffentlich hat Ihnen dieser Artikel die Bandbreite der leistungsstarken Funktionen gezeigt, die in Django verfügbar sind, und Ihnen ein Verständnis für die grundlegenden Verantwortlichkeiten einer Anwendung beim Erstellen von Benutzerkonten vermittelt.

Django Highlights ist eine Serie, in der wichtige Konzepte der Webentwicklung in Django vorgestellt werden. Jeder Artikel ist als eigenständiger Leitfaden zu einer Facette der Django-Entwicklung geschrieben, der Front-End-Entwicklern und -Designern helfen soll, ein tieferes Verständnis der „anderen Hälfte“ der Codebasis zu erlangen. Diese Artikel sind hauptsächlich darauf ausgelegt, Ihnen zu helfen, Theorie und Konventionen zu verstehen, enthalten jedoch einige Codebeispiele, die in Django 3.0 geschrieben wurden. Mehrere Konzepte, die wir in diesem Artikel angesprochen haben, einschließlich Vorlagen, Admin-Benutzer, Modelle und Formulare, werden in zukünftigen Artikeln dieser Reihe einzeln im Detail untersucht.

Weitere Teile der Reihe:

  • Django-Highlights: Templating speichert Zeilen (Teil 2)
  • Django-Highlights: Modelle, Verwaltung und Nutzung der relationalen Datenbank (Teil 3)
  • Django-Highlights: Umgang mit statischen Assets und Mediendateien (Teil 4)