Digamos que el sitio que usan sus usuarios está escrito en Joomla, pero para crear un nuevo producto para su audiencia, eligió el paquete Python / Django.
Como resultado, debe usar cuentas de usuario de la base de datos de Joomla en Django.
El problema, sin embargo, es que Joomla y Django usan algoritmos de hash de contraseña diferentes, por lo que solo falla la copia de las cuentas.
Después de leer la documentación de Django, desbordar la pila y pasar un tiempo, obtuve la solución que se describe a continuación, que utiliza las prácticas de desarrollo recomendadas para Django al máximo.
Advertencias
Es posible que esta solución arquitectónica no sea adecuada para usted, vea la discusión en los comentarios .
Para comprender lo que sucede en los ejemplos a continuación, debe tener cierta comprensión de la arquitectura de Django.
También supongo que sabe cómo implementar un proyecto Django, por lo que no estoy describiendo este proceso.
El código se copia de un proyecto en funcionamiento, pero será fácil de ajustar a su proyecto con un mínimo de cambios.
Probablemente, en la próxima versión principal de Django, este código puede romperse, sin embargo, el principio de solución seguirá siendo el mismo.
En esta guía, no describo el front-end del sistema de autorización, ya que:
- qué front-end tiene dependerá de las necesidades de su proyecto (incluso puede ser un punto final de la API Json, por ejemplo)
- esta información ya está descrita en los tutoriales oficiales de Django y en varios artículos iniciales
Algoritmo
- conectar la base de datos de Joomla (DB) al proyecto Django
- crear un modelo de JoomlaUser que represente a un usuario de la base de datos de Joomla
- escriba una función
check_joomla_password()
que verifique que la contraseña ingresada coincida con la contraseña original del usuario. - agregar un nuevo backend de autorización "Joomla Auth Backend" al proyecto, que, al autorizar al cliente en Django, obtendrá la cuenta de usuario de la base de datos de Joomla
1. Conexión a la base de datos de Joomla:
Si es necesario, en el mismo archivo con la configuración del proyecto, puede habilitar el registro de consultas de la base de datos:
2. crear un modelo JoomlaUser
- Lea cómo un modelo Django puede usar una base de datos existente
- Piense dónde colocar el nuevo JoomlaUser.
En mi proyecto, creé una aplicación llamada "usuarios" ( manage.py startapp users
). Contendrá el backend de autorización y el modelo de usuario de Joomla. - generar el modelo automáticamente usando inspectdb:
python manage.py inspectdb live_users --database="joomla_db"
joomla_db: el nombre de la base de datos que especificó en settings.py/DATABASES
;
live_users: nombre de la tabla con cuentas.
agregue su modelo a 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)
A continuación, debemos asegurarnos de que el modelo accederá a la base de datos correcta. Para hacer esto, agregue al proyecto un enrutador para consultas a diferentes bases de datos , que redirigirá las solicitudes del modelo JoomlaUser a su base de datos nativa.
Cree el archivo "db_routers.py" en la carpeta principal del proyecto (en el mismo lugar donde está su "settings.py"):
registre un nuevo enrutador en settings.py
:
Ahora puede obtener una cuenta de la base de datos anterior.
Inicie un terminal Django e intente extraer un usuario existente: python manage.py shell
>>> from users.models import JoomlaUser >>> print(JoomlaUser.objects.get(username='someuser')) JoomlaUser object (someusername) >>>
Si todo funciona (ve al usuario), vaya al siguiente paso. De lo contrario, mire la salida de error y corrija la configuración.
3. Verifique la contraseña de la cuenta de Joomla
Joomla no almacena las contraseñas de los usuarios, sino su hash, por ejemplo
$2y$10$aoZ4/bA7pe.QvjTU0R5.IeFGYrGag/THGvgKpoTk6bTz6XNkY0F2e
A partir de Joomla v3.2, las contraseñas de los usuarios se cifran con el algoritmo BLOWFISH .
Así que descargué el código de Python con este algoritmo:
pip install bcrypt echo bcrypt >> requirements.txt
Y creó una función para verificar las contraseñas en el 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
Atencion Las versiones de Joomla inferiores a la 3.2 utilizan un método de hashing diferente (md5 + salt), por lo que esta función no funcionará. En este caso, lea
discusión sobre Stackoverflow y crear una función de comprobación de hash que se parece a esto:
Desafortunadamente, no tengo una base de usuarios de la versión anterior de Joomla, así que no puedo probar esta función por usted.
4. Autorización de usuario de back-end de Joomla
Ahora está listo para crear un backend de Django para autorizar a los usuarios del proyecto Joomla.
lea cómo modificar el sistema de autorización de Django
Registre un nuevo backend (aún no existente) en project/settings.py
:
AUTHENTICATION_BACKENDS = [
Cree un backend de autorización de usuario de Joomla en users/backend.py
from django.contrib.auth.models import User from .models import JoomlaUser def check_joomla_password(password, hashed):
Resumen
Felicitaciones: ahora los usuarios de su sitio Joomla existente pueden usar sus credenciales en un nuevo sitio / aplicación.
Como autorización de los usuarios activos a través de la nueva interfaz, se copiarán uno por uno en la nueva base de datos.
Alternativamente, es posible que no desee copiar entidades de usuario del sistema antiguo al nuevo.
En este caso, aquí hay un enlace a un artículo que describe cómo reemplazar el modelo de usuario predeterminado con el suyo en Django (el modelo JoomlaUser descrito anteriormente).
La decisión final, si transferir o no a los usuarios, se toma sobre la base de la relación en la que estarán los proyectos nuevos y antiguos. Por ejemplo, dónde se llevará a cabo el registro de nuevos usuarios, qué sitio / aplicación será el principal, etc.
Pruebas y documentación.
Ahora agregue las pruebas y la documentación apropiadas que cubren el nuevo código. La lógica de esta solución está estrechamente entrelazada con la arquitectura de Django y no es muy obvia, por lo que si no realiza las pruebas / documentación ahora, el soporte para el proyecto será más complicado en el futuro.