دعنا نقول أن الموقع الذي يستخدمه المستخدمون مكتوب في جملة ، ولكن لإنشاء منتج جديد لجمهورك ، اخترت حزمة Python / Django.
نتيجة لذلك ، تحتاج إلى استخدام حسابات المستخدمين من قاعدة بيانات جملة في جانغو.
لكن المشكلة تكمن في أن جملة و Django يستخدمان خوارزميات مختلفة لتجزئة كلمات المرور ، لذلك فشل نسخ الحسابات فقط.
بعد قراءة وثائق Django ، تجاوز سعة المكدس وقضاء بعض الوقت ، حصلت على الحل الموضح أدناه ، والذي يستخدم ممارسات التطوير الموصى بها لـ Django إلى أقصى حد.
تحذيرات
قد لا يناسبك هذا الحل المعماري ، راجع المناقشة في التعليقات .
لفهم ما يحدث في الأمثلة أدناه ، يجب أن يكون لديك بعض فهم بنية جانغو.
أفترض أيضًا أنك تعرف كيفية نشر مشروع Django ، لذلك أنا لا أصف هذه العملية.
يتم نسخ الكود من مشروع عامل ، لكن سيكون من السهل التكيف مع مشروعك بأقل تغييرات.
ربما ، في الإصدار الرئيسي التالي من Django ، قد ينتهك هذا الرمز ، ومع ذلك ، سيبقى مبدأ الحل كما هو.
في هذا الدليل ، لا أصف الواجهة الأمامية لنظام الترخيص ، حيث:
- تعتمد الواجهة الأمامية التي لديك على احتياجات مشروعك (قد يكون حتى نقطة نهاية Json API ، على سبيل المثال)
- هذه المعلومات موصوفة بالفعل في البرامج التعليمية الرسمية في جانغو والمقالات المبدئية المختلفة
خوارزمية
- قم بتوصيل قاعدة بيانات جملة (DB) بمشروع Django
- إنشاء نموذج JoomlaUser يمثل مستخدمًا من قاعدة بيانات Joomla
- اكتب
check_joomla_password()
تتحقق من مطابقة كلمة المرور المدخلة لكلمة المرور الأصلية للمستخدم. - أضف ترخيصًا جديدًا للخلفية "Joomla Auth Backend" إلى المشروع ، والذي عند ترخيص العميل في Django ، سيحصل على حساب المستخدم من قاعدة بيانات Joomla
1. الاتصال بقاعدة بيانات جملة:
إذا لزم الأمر ، في نفس الملف مع إعدادات المشروع ، يمكنك تمكين تسجيل استعلامات قاعدة البيانات:
2. إنشاء نموذج JoomlaUser
- اقرأ كيف يمكن لنموذج Django استخدام قاعدة بيانات موجودة
- فكر في مكان وضع JoomlaUser الجديد.
في مشروعي ، قمت بإنشاء تطبيق يسمى "المستخدمين" ( manage.py startapp users
). سوف يحتوي على خلفية الترخيص ونموذج مستخدم جملة. - قم بإنشاء النموذج تلقائيًا باستخدام inspectdb:
python manage.py inspectdb live_users --database="joomla_db"
joomla_db - اسم قاعدة البيانات التي حددتها في settings.py/DATABASES
؛
live_users - اسم الجدول مع الحسابات.
أضف النموذج الخاص بك إلى 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)
بعد ذلك ، نحتاج إلى التأكد من وصول النموذج إلى قاعدة البيانات الصحيحة. للقيام بذلك ، أضف إلى المشروع جهاز توجيه للاستعلامات إلى قواعد بيانات مختلفة ، والتي ستعيد توجيه الطلبات من نموذج JoomlaUser إلى قاعدة بياناته الأصلية.
قم بإنشاء الملف "db_routers.py" في المجلد الرئيسي للمشروع (في نفس المكان الذي توجد به "settings.py"):
تسجيل جهاز توجيه جديد في settings.py
:
الآن يمكنك الحصول على حساب من قاعدة البيانات القديمة.
إطلاق محطة جانغو ومحاولة سحب مستخدم حالي: python manage.py shell
>>> from users.models import JoomlaUser >>> print(JoomlaUser.objects.get(username='someuser')) JoomlaUser object (someusername) >>>
إذا كان كل شيء يعمل (ترى المستخدم) ، فانتقل إلى الخطوة التالية. خلاف ذلك ، انظر إلى إخراج الخطأ وتصحيح الإعدادات.
3. تحقق من كلمة مرور حساب جملة
جملة لا تخزن كلمات مرور المستخدم ، ولكن تجزئة بهم ، على سبيل المثال
$2y$10$aoZ4/bA7pe.QvjTU0R5.IeFGYrGag/THGvgKpoTk6bTz6XNkY0F2e
بدءًا من Joomla v3.2 ، يتم تشفير كلمات مرور المستخدم باستخدام خوارزمية BLOWFISH .
لذلك قمت بتنزيل رمز python باستخدام هذه الخوارزمية:
pip install bcrypt echo bcrypt >> requirements.txt
وأنشأت وظيفة للتحقق من كلمات المرور في 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
انتباه! تستخدم إصدارات جملة أقل من 3.2 طريقة تجزئة مختلفة (md5 + ملح) ، لذلك لن تعمل هذه الوظيفة. في هذه الحالة ، اقرأ
مناقشة Stackoverflow وإنشاء وظيفة التحقق من التجزئة التي تبدو مثل هذا:
لسوء الحظ ، ليس لدي قاعدة مستخدمين من الإصدار القديم من جملة في متناول اليد ، لذلك لا يمكنني اختبار هذه الميزة لك.
4. الخلفية ترخيص المستخدم جملة
أنت الآن جاهز لإنشاء خلفية جانغو لتخويل المستخدمين من مشروع جملة.
قراءة كيفية تعديل نظام ترخيص جانغو
سجل خلفية جديدة (غير موجودة بعد) في project/settings.py
:
AUTHENTICATION_BACKENDS = [
قم بإنشاء خلفية ترخيص مستخدم جملة في users/backend.py
from django.contrib.auth.models import User from .models import JoomlaUser def check_joomla_password(password, hashed):
يؤدي
تهانينا - يمكن الآن لمستخدمي موقع جملة الحالي استخدام بيانات اعتمادهم في موقع / تطبيق جديد.
كتفويض للمستخدمين النشطين من خلال الواجهة الجديدة ، سيتم نسخهم واحدًا تلو الآخر في قاعدة البيانات الجديدة.
بدلاً من ذلك ، قد لا ترغب في نسخ كيانات المستخدم من النظام القديم إلى النظام الجديد.
في هذه الحالة ، إليك رابط لمقال يصف كيفية استبدال طراز المستخدم الافتراضي بنموذجك في Django (نموذج JoomlaUser الموضح أعلاه).
يتم اتخاذ القرار النهائي ، سواء نقل أو عدم نقل المستخدمين ، على أساس العلاقة التي ستكون عليها المشروعات الجديدة والقديمة. على سبيل المثال ، أين سيتم تسجيل المستخدمين الجدد ، والموقع / التطبيق سيكون الرئيسي ، وما إلى ذلك.
الاختبار والتوثيق
الآن يرجى إضافة الاختبارات والوثائق المناسبة التي تغطي الرمز الجديد. يرتبط منطق هذا الحل ارتباطًا وثيقًا بهندسة جانغو وهو غير واضح جدًا ، لذا إذا لم تقم بإجراء الاختبارات / الوثائق الآن ، فسيصبح دعم المشروع أكثر تعقيدًا في المستقبل.