هل يمكنني استخدام مصادقة HTTP الأساسية مع Django؟

StackOverflow https://stackoverflow.com/questions/152248

  •  02-07-2019
  •  | 
  •  

سؤال

لدينا موقع ويب يعمل على Apache، ويمكن الوصول إليه بعدد من الصفحات الثابتة المحمية عبر مصادقة HTTP الأساسية.

لقد كتبت جزءًا جديدًا من الموقع باستخدام Django باستخدام دعم Django المدمج لإدارة المستخدم.

المشكلة التي أواجهها هي أنه يتعين على المستخدمين تسجيل الدخول مرة واحدة عبر مصادقة HTTP الأساسية ثم مرة أخرى باستخدام نموذج تسجيل الدخول إلى Django.هذا أخرق ومربك للغاية للمستخدمين.

كنت أتساءل عما إذا كان أي شخص قد وجد طريقة لجعل Django يسجل دخول المستخدم باستخدام معلومات مصادقة HTTP الأساسية.

لا أتوقع تمرير كلمة المرور إلى Django، بل إذا كان المستخدم dave تمت مصادقته بواسطة Apache، فيجب تسجيل الدخول تلقائيًا إلى Django باسم dave أيضاً.

(أحد الخيارات هو جعل Apache و Django يتشاركان في متجر المستخدم لضمان أسماء المستخدمين وكلمات المرور الشائعة ولكن هذا سيظل يتضمن مطالبتين لتسجيل الدخول وهو ما أحاول تجنبه.)

هل كانت مفيدة؟

المحلول

تمت إضافة هذا إلى إصدار جانغو 1.3.انظر المزيد من الوثائق الحالية لهذا هنا:http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

نصائح أخرى

لدعم المصادقة الأساسية في بعض الطلبات فقط (وعدم التلاعب بخادم الويب - وهي الطريقة التي قد يفسر بها شخص ما عنوان سؤالك)، ستحتاج إلى النظر هنا:

http://www.djangosnippets.org/snippets/243/

هل تحقق من الروابط أولي.ترى بشكل أساسي اسم المستخدم الذي تمت مصادقته كما تم التحقق منه بواسطة مصادقة HTTP الأساسية في Django من خلال النظر إلى request.META['REMOTE_USER'].

تحديث: تم اختبار التصحيح المقترح للتذكرة #689, ، وهو متاح محدثًا في مستودع git الخاص بـ telenieko هنا.يتم تطبيقه بشكل نظيف على الأقل عند المراجعة 9084 جانجو.

قم بتنشيط الواجهة الخلفية لمصادقة المستخدم عن بعد

  • إضافة RemoteUserAuthMiddleware بعد AuthenticationMiddleware
  • إضافة الإعداد AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

إذا كنت تستخدم lighttpd وFastCGI كما أفعل، فقم بتنشيط mod_auth، وقم بإنشاء بيانات اعتماد لمستخدم اختباري (أسميته testuser وحدد 123 ككلمة المرور) وقم بتكوين موقع Django ليطلب المصادقة الأساسية.

الأتى urls.py يمكن استخدامها لاختبار الإعداد:

from django.conf.urls.defaults import *
from django.http import HttpResponse
from django.contrib.auth.models import User
urlpatterns = patterns('',
    url(regex='^$',
        view=lambda request: HttpResponse(repr(request), 'text/plain')),

    url(regex='^user/$',
        view=lambda request: HttpResponse(repr(request.user), 'text/plain')),

    url(regex='^users/$',
        view=lambda request: HttpResponse(
            ','.join(u.username for u in User.objects.all()),
            'text/plain')),
)

بعد إعادة تحميل lighty وخادم Django FCGI، أصبح تحميل جذر الموقع يطلب الآن المصادقة ويقبل testuser بيانات الاعتماد، ثم يقوم بإخراج تفريغ لكائن الطلب.في request.META يجب أن تكون هذه الخصائص الجديدة موجودة:

'AUTH_TYPE': 'Basic'
'HTTP_AUTHORIZATION': 'Basic dGVzdHVzZXI6MTIz'
'REMOTE_USER': 'testuser'

ال /user/ يمكن استخدام عنوان URL للتحقق من تسجيل الدخول بالفعل باسم testuser:

<User: testuser>

و ال /users/ يسرد عنوان URL الآن العناصر المضافة تلقائيًا testuser (هنا admin المستخدم الذي قمت بإنشائه عند القيام بذلك syncdb كما يظهر):

admin,testuser

إذا كنت لا ترغب في تصحيح Django، فمن السهل فصل ملف RemoteUserAuthBackend و RemoteUserAuthMiddleware الفئات في وحدة نمطية منفصلة والرجوع إلى ذلك في إعدادات Django.

هنالك httpauth.py.ما زلت مبتدئًا تمامًا في Django، لذا ليس لدي أي فكرة عن مدى ملاءمته تمامًا، ولكن يجب أن يفعل ما تبحث عنه.

يحرر:هنا موضوع علة أطول حول هذا الموضوع.

نظرًا لأنه يمكن تشغيل Django بعدة طرق، وmodpython فقط هو الذي يمنحك تكاملًا وثيقًا مع Apache، لا أعتقد أن هناك طريقة لـ Django لتسجيل دخولك بشكل أساسي إلى مصادقة Apache الأساسية.يجب أن تتم المصادقة على مستوى التطبيق لأنها ستمنحك المزيد من التحكم وستكون أكثر بساطة.أنت حقًا لا تريد متاعب مشاركة بيانات المستخدم بين Python وApache.

إذا كنت لا تمانع في استخدام نسخة مصححة من Django، فهناك تصحيح في http://www.djangosnippets.org/snippets/56/ والتي ستمنحك بعض البرامج الوسيطة لدعم المصادقة الأساسية.

المصادقة الأساسية بسيطة للغاية - إذا لم يقوم المستخدم بتسجيل الدخول، فستقوم بإرجاع رمز الحالة المطلوب للمصادقة 401.هذا يطالب المتصفح بعرض مربع تسجيل الدخول.سيقوم المتصفح بعد ذلك بتوفير اسم المستخدم وكلمة المرور كسلاسل مشفرة bas64.دخول ويكيبيديا http://en.wikipedia.org/wiki/Basic_access_authentication إنه جيد جدا.

إذا لم يقم التصحيح بما تريده، فيمكنك تنفيذ المصادقة الأساسية بنفسك بسرعة كبيرة.

يبدو أن هذه مهمة مخصصة AuthenticationBackend - يرى وثائق جانغو حول هذا الموضوع, ، يحتوي موقع djangosnippets.org على بعض الأمثلة الواقعية لمثل هذه التعليمات البرمجية (انظر 1 أو 2) (وهذا ليس بالأمر الصعب حقًا).

AuthenticationBackend يجب أن تحتوي الفئات الفرعية على طريقتين محددتين فقط وأن تكون التعليمات البرمجية الخاصة بها واضحة جدًا:يتعين على المرء إرجاع كائن المستخدم لمعرف المستخدم، ويجب على الثاني إجراء فحص لبيانات الاعتماد وإرجاع كائن المستخدم إذا كانت بيانات الاعتماد صالحة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top