Disons que le site que vos utilisateurs utilisent est écrit en Joomla, mais pour créer un nouveau produit pour votre public, vous avez choisi le bundle Python / Django.
Par conséquent, vous devez utiliser des comptes d'utilisateurs de la base de données Joomla dans Django.
Le problème, cependant, est que Joomla et Django utilisent des algorithmes de hachage de mot de passe différents, donc la copie des comptes échoue.
Après avoir lu la documentation de Django, débordement de pile et avoir passé un certain temps, j'ai obtenu la solution décrite ci-dessous, qui utilise au maximum les pratiques de développement recommandées pour Django.
Avertissements
Cette solution architecturale peut ne pas vous convenir, voir la discussion dans les commentaires .
Pour comprendre ce qui se passe dans les exemples ci-dessous, vous devez avoir une certaine compréhension de l'architecture Django.
Je suppose également que vous savez comment déployer un projet Django, donc je ne décris pas ce processus.
Le code est copié à partir d'un projet fonctionnel, mais il sera facile de s'adapter à votre projet avec un minimum de modifications.
Probablement, dans la prochaine version majeure de Django, ce code risque de casser, cependant, le principe de la solution restera le même.
Dans ce guide, je ne décris pas l'extrémité avant du système d'autorisation, car:
- le front-end dont vous disposez dépendra des besoins de votre projet (il peut même s'agir d'un point de terminaison de l'API Json, par exemple)
- ces informations sont déjà décrites dans les tutoriels officiels de Django et divers articles de démarrage
Algorithme
- connecter la base de données Joomla (DB) au projet Django
- créer un modèle JoomlaUser représentant un utilisateur de la base de données Joomla
- écrire une fonction
check_joomla_password()
qui vérifie que le mot de passe entré correspond au mot de passe d'origine de l'utilisateur. - ajouter un nouveau backend d'autorisation "Joomla Auth Backend" au projet qui, lors de l'autorisation du client dans Django, obtiendra le compte utilisateur de la base de données Joomla
1. Connexion à la base de données Joomla:
Si nécessaire, dans le même fichier avec les paramètres du projet, vous pouvez activer la journalisation des requêtes de base de données:
2. créer un modèle JoomlaUser
- Découvrez comment un modèle Django peut utiliser une base de données existante
- Réfléchissez à l'emplacement du nouveau JoomlaUser.
Dans mon projet, j'ai créé une application appelée "utilisateurs" ( manage.py startapp users
). Il contiendra le backend d'autorisation et le modèle utilisateur Joomla. - générer le modèle automatiquement en utilisant inspectdb:
python manage.py inspectdb live_users --database="joomla_db"
joomla_db - le nom de la base de données que vous avez spécifiée dans settings.py/DATABASES
;
live_users - nom de la table avec les comptes.
ajoutez votre modèle à 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)
Ensuite, nous devons nous assurer que le modèle accédera à la bonne base de données. Pour ce faire, ajoutez au projet un routeur pour les requêtes vers différentes bases de données , qui redirigera les requêtes du modèle JoomlaUser vers sa base de données native.
Créez le fichier "db_routers.py" dans le dossier principal du projet (au même endroit où se trouve votre "settings.py"):
enregistrer un nouveau routeur dans settings.py
:
Vous pouvez maintenant obtenir un compte dans l'ancienne base de données.
Lancez un terminal Django et essayez d'extraire un utilisateur existant: python manage.py shell
>>> from users.models import JoomlaUser >>> print(JoomlaUser.objects.get(username='someuser')) JoomlaUser object (someusername) >>>
Si tout fonctionne (vous voyez l'utilisateur), passez à l'étape suivante. Sinon, regardez la sortie d'erreur et corrigez les paramètres.
3. Vérifiez le mot de passe du compte Joomla
Joomla ne stocke pas les mots de passe des utilisateurs, mais leur hachage, par exemple
$2y$10$aoZ4/bA7pe.QvjTU0R5.IeFGYrGag/THGvgKpoTk6bTz6XNkY0F2e
À partir de Joomla v3.2, les mots de passe des utilisateurs sont cryptés à l'aide de l'algorithme BLOWFISH .
J'ai donc téléchargé du code python avec cet algorithme:
pip install bcrypt echo bcrypt >> requirements.txt
Et créé une fonction pour vérifier les mots de passe dans le 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
Attention! Les versions de Joomla inférieures à 3.2 utilisent une méthode de hachage différente (md5 + sel), donc cette fonction ne fonctionnera pas. Dans ce cas, lisez
discussion sur Stackoverflow et créer une fonction de vérification de hachage qui ressemble à ceci:
Malheureusement, je n'ai pas de base d'utilisateurs de l'ancienne version de Joomla à portée de main, donc je ne peux pas tester cette fonctionnalité pour vous.
4. Autorisation utilisateur backend Joomla
Vous êtes maintenant prêt à créer un backend Django pour autoriser les utilisateurs du projet Joomla.
lire comment modifier le système d'autorisation Django
Enregistrez un nouveau backend (pas encore existant) dans project/settings.py
:
AUTHENTICATION_BACKENDS = [
Créez un backend d'autorisation utilisateur Joomla dans users/backend.py
from django.contrib.auth.models import User from .models import JoomlaUser def check_joomla_password(password, hashed):
Résumé
Félicitations - les utilisateurs de votre site Joomla existant peuvent désormais utiliser leurs informations d'identification sur un nouveau site / application.
En tant qu'autorisation des utilisateurs actifs via la nouvelle interface, ils seront copiés un par un dans la nouvelle base de données.
Vous pouvez également ne pas vouloir copier les entités utilisateur de l'ancien système vers le nouveau.
Dans ce cas, voici un lien vers un article qui décrit comment remplacer le modèle utilisateur par défaut dans Django par le vôtre (le modèle JoomlaUser décrit ci-dessus).
La décision finale, de transférer ou non les utilisateurs, est prise sur la base de la relation dans laquelle les nouveaux et anciens projets seront. Par exemple, où aura lieu l'enregistrement des nouveaux utilisateurs, quel site / application sera le principal, etc.
Test et documentation
Veuillez maintenant ajouter les tests et la documentation appropriés couvrant le nouveau code. La logique de cette solution est étroitement liée à l'architecture Django et n'est pas très évidente, donc si vous ne faites pas les tests / la documentation maintenant, le support du projet deviendra plus difficile à l'avenir.