Angenommen, die von Ihren Benutzern verwendete Website ist in Joomla geschrieben. Um jedoch ein neues Produkt für Ihr Publikum zu erstellen, haben Sie das Python / Django-Bundle ausgewählt.
Daher müssen Sie Benutzerkonten aus der Joomla-Datenbank in Django verwenden.
Das Problem ist jedoch, dass Joomla und Django unterschiedliche Kennwort-Hashing-Algorithmen verwenden, sodass nur das Kopieren der Konten fehlschlägt.
Nachdem ich die Django-Dokumentation gelesen, den Stapel übergelaufen und einige Zeit verbracht hatte, erhielt ich die unten beschriebene Lösung, die die empfohlenen Entwicklungspraktiken für Django maximal nutzt.
Warnungen
Diese architektonische Lösung passt möglicherweise nicht zu Ihnen, siehe Diskussion in den Kommentaren .
Um zu verstehen, was in den folgenden Beispielen passiert, müssen Sie die Django-Architektur verstehen.
Ich gehe auch davon aus, dass Sie wissen, wie man ein Django-Projekt bereitstellt, daher beschreibe ich diesen Prozess nicht.
Der Code wird aus einem Arbeitsprojekt kopiert, lässt sich jedoch mit einem Minimum an Änderungen leicht an Ihr Projekt anpassen.
Wahrscheinlich wird dieser Code in der nächsten Hauptversion von Django brechen, das Lösungsprinzip bleibt jedoch dasselbe.
In diesem Handbuch beschreibe ich das Frontend des Autorisierungssystems nicht, da:
- Welches Front-End Sie haben, hängt von den Anforderungen Ihres Projekts ab (es kann beispielsweise sogar ein Json-API-Endpunkt sein).
- Diese Informationen sind bereits in den offiziellen Django-Tutorials und verschiedenen Starterartikeln beschrieben
Algorithmus
- Verbinden Sie die Joomla-Datenbank (DB) mit dem Django-Projekt
- Erstellen Sie ein JoomlaUser-Modell, das einen Benutzer aus der Joomla-Datenbank darstellt
- Schreiben Sie eine Funktion
check_joomla_password()
, die überprüft, ob das eingegebene Kennwort mit dem ursprünglichen Kennwort des Benutzers übereinstimmt. - Fügen Sie dem Projekt ein neues Autorisierungs-Backend "Joomla Auth Backend" hinzu, das bei der Autorisierung des Clients in Django das Benutzerkonto aus der Joomla-Datenbank erhält
1. Verbindung zur Joomla-Datenbank:
Bei Bedarf können Sie in derselben Datei mit den Projekteinstellungen die Protokollierung von Datenbankabfragen aktivieren:
2. Erstellen Sie ein JoomlaUser-Modell
- Lesen Sie, wie ein Django-Modell eine vorhandene Datenbank verwenden kann
- Überlegen Sie, wo Sie den neuen JoomlaUser platzieren möchten.
In meinem Projekt habe ich eine Anwendung namens "Benutzer" erstellt ( manage.py startapp users
). Es enthält das Autorisierungs-Backend und das Joomla-Benutzermodell. - Generieren Sie das Modell automatisch mit inspectdb:
python manage.py inspectdb live_users --database="joomla_db"
joomla_db - der Name der Datenbank, die Sie in settings.py/DATABASES
;
live_users - Name der Tabelle mit Konten.
users/models.py
Sie Ihr Modell zu users/models.py
:
class JoomlaUser(models.Model): """ Represents our customer from the legacy Joomla database. """ username = models.CharField(max_length=150, primary_key=True) email = models.CharField(max_length=100) password = models.CharField(max_length=100)
Als nächstes müssen wir sicherstellen, dass das Modell auf die richtige Datenbank zugreift. Fügen Sie dazu dem Projekt einen Router für Abfragen an verschiedene Datenbanken hinzu , der Anforderungen vom JoomlaUser-Modell an die native Datenbank umleitet.
Erstellen Sie die Datei "db_routers.py" im Hauptordner des Projekts (an derselben Stelle, an der sich Ihre "settings.py" befindet):
Registrieren Sie einen neuen Router in settings.py
:
Jetzt können Sie ein Konto aus der alten Datenbank erhalten.
Starten Sie ein Django-Terminal und versuchen Sie, einen vorhandenen Benutzer python manage.py shell
: python manage.py shell
>>> from users.models import JoomlaUser >>> print(JoomlaUser.objects.get(username='someuser')) JoomlaUser object (someusername) >>>
Wenn alles funktioniert (Sie sehen den Benutzer), fahren Sie mit dem nächsten Schritt fort. Andernfalls überprüfen Sie die Fehlerausgabe und korrigieren Sie die Einstellungen.
3. Überprüfen Sie das Joomla-Kontokennwort
Joomla speichert keine Benutzerkennwörter, sondern beispielsweise deren Hash
$2y$10$aoZ4/bA7pe.QvjTU0R5.IeFGYrGag/THGvgKpoTk6bTz6XNkY0F2e
Ab Joomla v3.2 werden Benutzerkennwörter mit dem BLOWFISH- Algorithmus verschlüsselt.
Also habe ich Python-Code mit diesem Algorithmus heruntergeladen:
pip install bcrypt echo bcrypt >> requirements.txt
Und eine Funktion zum Überprüfen von Passwörtern in der users/backend.py
:
def check_joomla_password(password, hashed): """ Check if password matches the hashed password, using same hashing method (Blowfish) as Joomla >= 3.2 If you get wrong results with this function, check that the Hash starts from prefix "$2y", otherwise it is probably not a blowfish hash :return: True/False """ import bcrypt if password is None: return False
Achtung! Joomla-Versionen unter 3.2 verwenden eine andere Hashing-Methode (md5 + salt), sodass diese Funktion nicht funktioniert. In diesem Fall lesen
Diskussion über Stackoverflow und Erstellen einer Hash-Check-Funktion, die ungefähr so aussieht:
Leider habe ich keine Benutzerbasis aus der alten Version von Joomla zur Hand, daher kann ich diese Funktion nicht für Sie testen.
4. Backend-Benutzerautorisierung Joomla
Jetzt können Sie ein Django-Backend erstellen, um Benutzer aus dem Joomla-Projekt zu autorisieren.
Lesen Sie, wie Sie das Django-Autorisierungssystem ändern
Registrieren Sie ein neues Backend (noch nicht vorhanden) in project/settings.py
:
AUTHENTICATION_BACKENDS = [
Erstellen Sie ein Joomla-Benutzerautorisierungs-Backend in users/backend.py
from django.contrib.auth.models import User from .models import JoomlaUser def check_joomla_password(password, hashed):
Zusammenfassung
Herzlichen Glückwunsch - jetzt können Benutzer Ihrer vorhandenen Joomla-Site ihre Anmeldeinformationen auf einer neuen Site / Anwendung verwenden.
Als Autorisierung aktiver Benutzer über die neue Schnittstelle werden diese einzeln in die neue Datenbank kopiert.
Alternativ möchten Sie möglicherweise keine Benutzerentitäten vom alten auf das neue System kopieren.
In diesem Fall finden Sie hier einen Link zu einem Artikel, in dem beschrieben wird, wie Sie das Standardbenutzermodell in Django (das oben beschriebene JoomlaUser-Modell) durch Ihr eigenes ersetzen .
Die endgültige Entscheidung, ob Benutzer übertragen werden sollen oder nicht, wird auf der Grundlage der Beziehung getroffen, in der sich das neue und das alte Projekt befinden. Wo findet beispielsweise die Registrierung neuer Benutzer statt, welche Site / Anwendung wird die Hauptwebsite sein usw.
Test und Dokumentation
Fügen Sie nun die entsprechenden Tests und Dokumentationen hinzu, die den neuen Code abdecken. Die Logik dieser Lösung ist eng mit der Django-Architektur verknüpft und nicht sehr offensichtlich. Wenn Sie die Tests / Dokumentationen jetzt nicht durchführen, wird die Unterstützung für das Projekt in Zukunft komplizierter.