Django / سير تطبيق موثوق / الدرس 9
المصادقة ودورة حياة الجلسة
استخدم المصادقة والجلسة المهيأتين دون خلط الهوية الداخلة بإذن كل مورد.
في هذه الصفحة
أهداف الدرس
- توفر الهوية خلفية مهيأة
- فحص كلمة دون تخزين مستخدم
- اختبار الاستمرار والخروج وافتراضات النشر
توفر الهوية خلفية مهيأة
تنسق المكونات المستخدم وكلمة السر والدخول والصلاحيات. قد يختلف النموذج فاحصل عليه بالواجهة والإعداد لا افتراض الصنف. يسبق وسيط الجلسة عادة المصادقة، ولا تكتسب RequestFactory الهوية تلقائيا. ميز الغائب وغير النشط بحسب الخلفية والمعروف الممنوع. لا يمنح الدخول ملكية كل مقرر أو تغيير غيره. وقد تختلف دلالة الحساب غير النشط باختلاف الخلفية المختارة، لذلك لا ينبغي تعميم نجاح أو رفض حالة واحدة على كل تكامل مصادقة ممكن.
عقد إطار لتخزين كلمات السر
استخدم واجهات التجزئة أو إدارة المستخدم لا النص الصريح أو مقارنته بالتجزئة. لا تجزئ ثانية وتقارن السلسلتين لاختلاف الملح. يختبر المثال نصا مصطنعا ويطبع المنطق لا التجزئة أو سرا حقيقيا. تبقى سياسة السر والاسترداد والمحدد والعوامل مسؤوليات تطبيق؛ فلا يقدم الأساس تلقائيا محدد محاولات كاملا. ويجب ألا تحتوي السجلات أو عناوين الطلب أو القيم المعادة للنموذج كلمة المرور نفسها، حتى أثناء تشخيص فشل الدخول ببيانات تجريبية.
فحص كلمة دون تخزين مستخدم
ينشئ البرنامج تجزئة واحدة ويختبر مرشحا صحيحا وآخر خاطئا دون جدول أو جلسة. يثبت واجهة التجزئة لا توصيل الدخول والارتباط والوكيل. يستخدم الحقيقي النموذج أو authenticate والخلفية ويخفي كشف الحساب غير الضروري ويبعد السر عن السجل والعنوان والمدخل المعاد. اختبر البيانات فعلا منفصلة عن فرض الهوية. أما اختبار يفرض هوية مباشرة فيفيد فحص الصفحات المحمية، لكنه يتجاوز مسار تقديم كلمة المرور وفحصها ولا يصلح دليلا على ذلك المسار.
from django.conf import settings
settings.configure(
SECRET_KEY="synthetic-course-key",
USE_I18N=False, USE_TZ=True,
INSTALLED_APPS=[],
DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}},
DEFAULT_AUTO_FIELD="django.db.models.AutoField",
ALLOWED_HOSTS=["testserver"],
)
import django
django.setup()
from django.contrib.auth.hashers import make_password, check_password
encoded = make_password("synthetic-course-passphrase")
print(check_password("synthetic-course-passphrase", encoded))
print(check_password("different-synthetic-value", encoded))
True
False
تستخدم مرشحات مصطنعة ونتائج منطقية دون مستخدم أو جلسة أو قاعدة.
استخدام عروض الدخول والخروج المقصودة
يربط المقطع العرضين ويحتاج تطبيقات المصادقة والجلسة وترحيلها بعزل والوسيط وقالب الدخول مع CSRF وسياسة ما بعده. خروج 5.2 مخصص لـPOST لا رابط GET مغير؛ استخدم نموذجا داخليا محميا. توفر العروض عمرًا مفيدا ولا تضبط كل ارتباط واسترداد ومحدد لمجرد الأنماط. كما يجب توفير قالب الدخول الفعلي ومسار الإعادة وسياسات الاسترداد والمحدد حسب تصميم التطبيق؛ فوجود النمطين وحده لا ينشئ منظومة مكتملة.
from django.contrib.auth.views import LoginView, LogoutView
from django.urls import path
urlpatterns = [
path("accounts/login/", LoginView.as_view(template_name="registration/login.html"), name="login"),
path("accounts/logout/", LogoutView.as_view(next_page="/"), name="logout"),
]
In the declared app: login uses the supplied template; POST logout follows the configured redirect.
يتطلب منظومة المصادقة والجلسة والقالب والسياسات؛ الخروج POST في الأساس ولا ينفذ المقطع.
اختبار الاستمرار والخروج وافتراضات النشر
اختبر الصحيح والخاطئ والطلب التالي والخروج وما بعده؛ تتجاوز force_login كلمة السر. قد تفسر خصائص الارتباط وHTTPS والوكيل اختفاء الجلسة، فشخصها لا تعطل CSRF ولا تعرض السر. تحمي الجلسة الموقعة السلامة لا تشفر الأسرار. اختر التخزين والبيانات، وحدد إبطال كل الأجهزة والمزود الخارجي مستقلا. وتحتاج سياسة الخروج من كل الأجهزة أو إنهاء جلسة مزود هوية خارجي اتفاقا مختلفا عن إنهاء جلسة المتصفح الحالية، مع اختبارات خاصة لنطاقها.
الأخطاء الشائعة وإصلاحها
يفقد الطلب المستخدم والجلسة
- لماذا يحدث؟
- لا يوفرهما الوسيط أو حد الاختبار.
- كيف تصلحه؟
- افحص الترتيب والمسار.
- كيف تتجنب تكراره؟
- افصل المباشر والمصادقة.
تفشل الأسرار المتطابقة بمقارنة التجزئة
- لماذا يحدث؟
- تختلف الأملاح.
- كيف تصلحه؟
- استخدم الفحص أو الخلفية.
- كيف تتجنب تكراره؟
- لا تقارن السلسلتين يدويا.
يُفترض أن الخروج ينهي كل الجلسات
- لماذا يحدث؟
- لم يحدد نطاقه.
- كيف تصلحه؟
- حدد المتصفح والأجهزة والمزود.
- كيف تتجنب تكراره؟
- اختبر المحمي التالي.
اختبر فهمك
1. لماذا لا تثبت force_login فحص السر بالنموذج؟
اعرض الحل المشروح
توفر الهوية دون مسار البيانات؛ استخدمها لما بعد الدخول وأضف طلبات فعلية معزولة بصحيح وخاطئ وافحص الاستمرار والفشل.
2. هل توضع بيانات حساسة بجلسة ارتباط موقعة لأنها موقعة؟
اعرض الحل المشروح
لا؛ تحمي التوقيع السلامة لا يخفي المحتوى عن حامل المتصفح. قلل البيانات واختر تخزينا وسرية مناسبين وأبعد الأسرار عن حالة العميل.
أهم ما تعلمته
- استخدم عقد المستخدم والخلفية المهيأ.
- يختلف فحص التجزئة عن المساواة.
- يحتاج استمرار الجلسة ونطاقها اختبارات.