مقدمة
المصادقة هي عملية التحقق من هوية المستخدمين أثناء طلبات تسجيل الدخول. في عملية المصادقة ، يقدم المستخدمون بيانات اعتمادهم كأسماء مستخدمين وكلمات مرور. ثم يقوم التطبيق بمطابقة تلك بيانات الاعتماد مع إدخالات قاعدة البيانات المخزنة. يمنح التطبيق المستخدمين الوصول إلى النظام في حالة وجود تطابق.
تخزين بيانات اعتماد تسجيل الدخول في قاعدة بيانات علاقية مثل MySQL أو PostgreSQL بدون آلية تخزين مؤقت لا يزال يعتبر نهجًا شائعًا وعمليًا ، ولكنه يأتي مع القيود التالية:
-
تحميل القاعدة بشكل زائد. يجب أن يقوم التطبيق بالذهاب والعودة إلى خادم قاعدة البيانات للتحقق من بيانات اعتماد المستخدمين من جدول قاعدة البيانات في كل مرة يقدم فيها المستخدم طلب تسجيل دخول. نظرًا لأن قاعدة البيانات قد تخدم لا يزال طلبات قراءة / كتابة أخرى ، يتسبب العملية بأكملها في تحميل القاعدة بشكل زائد وتجعلها بطيئة.
-
قواعد البيانات التقليدية المستندة إلى القرص لديها مشاكل في التوسعية. عندما يتلقى تطبيقك آلاف الطلبات في الثانية ، لا تعمل قواعد البيانات المستندة إلى القرص بشكل مثالي.
للتغلب على التحديات المذكورة أعلاه، يمكنك استخدام Redis لتخزين ذاكرة التخزين المؤقت لبيانات تسجيل الدخول للمستخدمين بحيث لا يحتاج التطبيق الخاص بك للاتصال بقاعدة البيانات الخلفية أثناء كل طلب تسجيل دخول. Redis هو أحد أشهر مخازن البيانات فائقة السرعة التي تستخدم ذاكرة الوصول العشوائي للكمبيوتر الخاص بك لتخزين البيانات في أزواج المفاتيح والقيم. في هذا الدليل، ستستخدم قاعدة بيانات Redis لتسريع معالجة الجلسات في تطبيق Python/MySQL الخاص بك على خادم Ubuntu 22.04.
المتطلبات الأساسية
قبل أن تبدأ في هذا البرنامج التعليمي، ستحتاج إلى إعداد ما يلي:
-
التبديل إلى حساب المستخدم الجديد
sudo
وتثبيت:
الخطوة 1 – تثبيت برامج تشغيل قواعد بيانات Python لـ Redis و MySQL
تقوم هذه التطبيقات بتخزين بيانات اعتماد المستخدمين بشكل دائم، مثل الأسماء وكلمات المرور، في خادم قاعدة بيانات MySQL. عندما يقوم المستخدم بتسجيل الدخول إلى التطبيق، يقوم نص برمجي بلغة Python بالاستعلام عن قاعدة بيانات MySQL ومطابقة التفاصيل مع القيم المخزنة. بعد ذلك، يقوم نص برمجي بلغة Python بتخزين بيانات تسجيل دخول المستخدم في قاعدة بيانات Redis لخدمة طلبات أخرى في المستقبل. لإكمال هذه الخطط، يحتاج نصوص برمجية بلغة Python إلى برامج تشغيل قواعد البيانات (وحدات Python) للتواصل مع خوادم MySQL و Redis. اتبع الخطوات التالية لتثبيت برامج التشغيل:
- قم بتحديث مؤشر معلومات الحزم وقم بتشغيل الأمر التالي لتثبيت
python3-pip
، وهو مدير حزم Python يسمح لك بتثبيت وحدات إضافية ليست جزءًا من مكتبة Python القياسية.
- قم بتثبيت برنامج تشغيل MySQL for Python:
- قم بتثبيت برنامج تشغيل Redis for Python:
بعد تثبيت برامج التشغيل اللازمة للتواصل مع MySQL و Redis، قم بالانتقال إلى الخطوة التالية وقم بتهيئة قاعدة بيانات MySQL.
الخطوة 2 – إعداد قاعدة بيانات MySQL عينية
لهذا الدليل، ستحتاج إلى جدول MySQL واحد. في بيئة الإنتاج، يمكنك أن تكون لديك عشرات الجداول التي تخدم طلبات أخرى. قم بإعداد قاعدة بيانات وإنشاء الجدول عن طريق تنفيذ الأوامر التالية:
-
تسجيل الدخول إلى خادم قاعدة بيانات MySQL باستخدام مستخدم
root
: -
أدخل كلمة مرور المستخدم الجذر لخادم MySQL الخاص بك عندما يُطلب واضغط على
ENTER
للمتابعة. ثم قم بتشغيل الأمر التالي لإنشاء قاعدة بياناتcompany
نموذجية وحسابcompany_user
. استبدلexample-mysql-password
بكلمة مرور قوية:
-
تأكد من أنك تتلقى النتيجة التالية للتأكيد على أن الأوامر السابقة تم تنفيذها بنجاح:
-
التبديل إلى قاعدة البيانات الجديدة
company
: -
تأكيد الاتصال بقاعدة البيانات الجديدة من خلال التحقق من الناتج التالي:
-
أنشئ جدول “system_users”. تعمل عمود “user_id” كمفتاح أساسي لتحديد هوية كل مستخدم بشكل فريد. تعمل أعمدة “username” و “password” كبيانات تسجيل الدخول التي يجب على المستخدمين إرسالها لتسجيل الدخول إلى التطبيق. تخزن أعمدة “first_name” و “last_name” أسماء المستخدمين:
-
تأكد من إنشاء الجدول الجديد عن طريق التحقق من الناتج التالي:
-
املأ جدول
system_users
ببيانات عينة. استخدم وظيفةMD5(...)
المدمجة في MySQL لتجزئة كلمة المرور لأغراض الأمان: -
تحقق من النتيجة أدناه:
-
استعلم جدول
system_users
للتأكد من وجود البيانات: -
تحقق من الناتج التالي:
-
تسجيل الخروج من قاعدة بيانات MySQL:
لقد قمت الآن بإعداد قاعدة بيانات MySQL الصحيحة لتطبيقك. في الخطوة التالية، ستقوم بإنشاء وحدة Python تتواصل مع قاعدة البيانات الخاصة بك.
الخطوة 3 – إنشاء وحدة بوابة MySQL المركزية لـ Python
عند كتابة أي مشروع Python، يجب عليك إنشاء وحدة منفصلة لكل مهمة لتعزيز إعادة استخدام الكود. في هذه الخطوة، ستقوم بإعداد وحدة مركزية تسمح لك بالاتصال واستعلام قاعدة بيانات MySQL من خلال نص Python. اتبع الخطوات التالية:
-
أنشئ مجلد
project
. يفصل هذا المجلد ملفات الشفرة الخاصة بك من باقي ملفات النظام: -
انتقل إلى مجلد المشروع الجديد:
-
استخدم محرر النص
nano
لفتح ملفmysql_db.py
الجديد. يحتوي هذا الملف على الوحدة النمطية في Python التي تتحدث إلى قاعدة بيانات MySQL: -
أدخل المعلومات التالية في ملف
mysql_db.py
. استبدلexample-mysql-password
بكلمة مرور MySQL الصحيحة لحسابcompany_user
:~/project/mysql_db.py -
احفظ وأغلق ملف
mysql_db.py
.
يحتوي ملف الوحدة النمطية mysql_db.py
على فئة واحدة (MysqlDb:
) مع طريقتين:
– db_con(self):
, يتصل بقاعدة البيانات company
المثالية التي قمت بإنشائها سابقًا ويعيد اتصالًا قابلًا لإعادة الاستخدام بMySQL باستخدام عبارة return mysql_con
.
– query(self, username, password):
, وهي طريقة تقبل username
و password
وتستعلم جدول system_users
لمعرفة ما إذا كان هناك تطابق. تعيد العبارة الشرطية if row_count < 1: ... else: return result[1]
القيمة المنطقية False
إذا لم يكن المستخدم موجودًا في الجدول أو كلمة المرور للمستخدم (result[1]
) إذا وجد التطبيق تطابقًا.
مع وحدة MySQL جاهزة، اتبع الخطوة التالية لإعداد وحدة Redis مماثلة تتواصل مع مخزن المفاتيح Redis.
الخطوة 4 – إنشاء وحدة Redis مركزية للغة Python
في هذه الخطوة، ستقوم بكتابة وحدة تتصل بخادم Redis. قم بتنفيذ الخطوات التالية:
-
افتح ملفًا جديدًا بعنوان
redis_db.py
: -
أدخل المعلومات التالية في ملف
redis_db.py
. استبدلexample-redis-password
بكلمة مرور صحيحة لخادم Redis:~/project/redis_db.py -
حفظ وإغلاق ملف
redis_db.py
.
-
يحتوي الملف أعلاه على فئة واحدة (
RedisDb:
). -
تحت هذه الفئة، يستخدم الأسلوب
db_con(self):
المعتمدات المقدمة للاتصال بخادم Redis وإرجاع اتصال قابل لإعادة الاستخدام باستخدام عبارةreturn redis_con
.
بعد إعداد فئة Redis، قم بإنشاء الملف الرئيسي لمشروعك في الخطوة التالية.
الخطوة 5 – إنشاء نقطة الدخول للتطبيق
يجب أن يحتوي كل تطبيق Python على نقطة دخول أو الملف الرئيسي الذي يتم تنفيذه عند تشغيل التطبيق. في هذا الملف، ستقوم بإنشاء رمز يعرض وقت الخادم الحالي للمستخدمين المصادق عليهم. يستخدم هذا الملف وحدات MySQL و Redis المخصصة التي قمت بإنشائها للمصادقة على المستخدمين. اتبع الخطوات أدناه لإنشاء الملف:
-
فتح ملف جديد بعنوان
index.py
: -
أدخل المعلومات التالية في ملف
index.py
:~/project/index.py -
احفظ وأغلق ملف
index.py
.
-
في ملف
index.py
، يتم إضافة الوحدات النمطية التالية إلى مشروعك في قسمimport...
:-
utf_8
،base64
،md5
، وjson
، وحدات الترميز والتنسيق النصي. -
http.server
،HTTPStatus
، وsocketserver
، وحدات خادم الويب. -
datetime
، وحدة الوقت/التاريخ. -
mysql_db
وredis_db
، وحدات مخصصة قمت بإنشائها مسبقًا للوصول إلى خوادم MySQL و Redis.
-
-
الفئة المعالجة
HttpHandler(http.server.SimpleHTTPRequestHandler):
هي فئة معالج لخادم HTTP. تحت الفئة ، يخدم الأسلوبdo_GET(self):
طلبات HTTP GET ويعرض تاريخ / وقت النظام للمستخدمين المصرح لهم. -
في منطق
if ... : else: ...
، يقوم البرنامج النصي بتشغيل البيان المنطقيif redis_client.exists(auth_user):
للتحقق مما إذا كانت بيانات اعتماد المستخدم موجودة في خادم Redis. إذا كانت تفاصيل المستخدم موجودة وكلمة المرور المخزنة في Redis لا تتطابق مع كلمة المرور المرسلة من المستخدم ، يقوم التطبيق بإرجاع خطأ{"error": "اسم المستخدم / كلمة المرور غير صالحة."}
.
إذا لم تكن تفاصيل المستخدم موجودة في خادم Redis ، يقوم التطبيق بالاستعلام عن قاعدة بيانات MySQL باستخدام البيان mysql_resp = mysql_server.query(auth_user, auth_password)
. إذا لم يتطابق كلمة المرور المقدمة من المستخدم مع القيمة المخزنة في قاعدة البيانات ، يقوم التطبيق بإرجاع خطأ {"error": "اسم المستخدم / كلمة المرور غير صالحة."}
. وإلا ، يقوم التطبيق بتخزين تفاصيل المستخدم في خادم Redis باستخدام البيان redis_client.set(auth_user, mysql_resp)
.
-
في جميع الحالات التي تتطابق فيها بيانات اعتماد المستخدم مع تفاصيل Redis/MySQL ، يعرض التطبيق تاريخ/وقت النظام الحالي باستخدام تعليمة
{"time": current_time, ...}
. إدخالauthorized by
في الناتج يتيح لك رؤية خادم قاعدة البيانات الذي يوثق المستخدمين في التطبيق.
لقد قمت الآن بإعداد الملف الرئيسي للتطبيق. في الخطوة التالية، ستقوم باختبار التطبيق.
الخطوة 6 – اختبار التطبيق
في هذه الخطوة، ستقوم بتشغيل التطبيق للتحقق مما إذا كان آلية التخزين المؤقت لـ Redis تعمل. قم بتنفيذ الأوامر التالية لاختبار التطبيق:
-
استخدم الأمر التالي لتشغيل التطبيق باستخدام
python3
: -
تأكد من تشغيل خادم الويب المخصص للتطبيق:
-
أنشئ اتصالًا آخر بخادمك باستخدام بروتوكول SSH في نافذة طرفية جديدة وقم بتشغيل أوامر curl التالية لإرسال أربعة طلبات GET باستخدام بيانات اعتماد john_doe. أضف [1-4] في نهاية عنوان URL http://localhost:8080/ لإرسال الأربعة طلبات في أمر واحد:
-
تحقق من النتائج التالية. خادم MySQL يخدم فقط طلب المصادقة الأول. ثم يخدم قاعدة بيانات Redis الطلبات الثلاثة التالية.
تعمل منطق التطبيق الخاص بك الآن كما هو متوقع.
الاستنتاج
في هذا الدليل، قمت ببناء تطبيق برمجي بلغة Python يستخدم خادم Redis لتخزين مؤقت لبيانات تسجيل الدخول للمستخدمين. Redis هو خادم قاعدة بيانات متوفر بشكل كبير وقابل للتوسعة ويمكنه تنفيذ آلاف المعاملات في الثانية. باستخدام آلية التخزين المؤقت في تطبيقك باستخدام Redis، يمكنك تقليل حركة المرور على خادم قاعدة البيانات الخلفية بشكل كبير. لمعرفة المزيد حول تطبيقات Redis، يرجى الاطلاع على دروسنا حول Redis.