2008-09-30 18 views
32

हमारे पास अपाचे पर चल रही एक वेबसाइट है, जिस तक पहुंच HTTP मूल प्रमाणीकरण के माध्यम से कई स्थिर पृष्ठों को संरक्षित किया गया है।क्या मैं Django के साथ HTTP मूल प्रमाणीकरण का उपयोग कर सकता हूं?

मैंने Django के उपयोगकर्ता प्रबंधन के लिए समर्थन में उपयोग किए गए Django के साथ साइट का एक नया हिस्सा लिखा है।

मेरी समस्या यह है कि उपयोगकर्ताओं को HTTP मूल प्रमाणीकरण के माध्यम से एक बार लॉग इन करना होगा और फिर एक Django लॉगिन फ़ॉर्म का उपयोग करना होगा। यह दोनों उपयोगकर्ताओं के लिए बेकार और बहुत भ्रमित है।

मैं सोच रहा था कि अगर किसी को HTTP मूल प्रमाणीकरण जानकारी का उपयोग करने में उपयोगकर्ता को Django लॉग करने का कोई तरीका मिल गया है।

मैं Django को पासवर्ड पास करने की उम्मीद नहीं कर रहा हूं, बल्कि यदि उपयोगकर्ता dave को अपाचे द्वारा प्रमाणित किया गया है तो उन्हें स्वचालित रूप से Django में dave के रूप में लॉग इन होना चाहिए।

(एक विकल्प अपाचे और Django एक उपयोगकर्ता की दुकान आम उपयोगकर्ता नाम और पासवर्ड को सुनिश्चित करने के लिए साझा करने के लिए होगा, लेकिन यह अभी भी दो लॉगिन संकेतों शामिल होगा जो कि मैं क्या से बचने के लिए कोशिश कर रहा हूँ है।)

उत्तर

20

यह Django 1.3 रिलीज में जोड़ा गया है। यह यहाँ के लिए और अधिक वर्तमान दस्तावेज़ देखें: http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

+0

प्रश्न को अद्यतित रखने के लिए धन्यवाद! –

3

वहाँ httpauth.py है । मैं अभी भी Django के साथ एक पूर्ण नौसिखिया हूँ इसलिए मुझे नहीं पता कि यह वास्तव में कैसे फिट बैठता है, लेकिन यह वही करना चाहिए जो आप खोज रहे हैं।

संपादित करें: यहां a longer bug thread on the subject है।

+0

इस के लिए धन्यवाद। मैं अगले हफ्ते परीक्षण करने के लिए कुछ समय देने की उम्मीद कर रहा हूं और यदि सब ठीक हो जाए तो मैं आपका जवाब स्वीकार करूंगा। –

0

क्योंकि django कई तरीकों से चलाया जा सकता है, और केवल modpython आपको अपाचे के साथ घनिष्ठ एकीकरण देता है, मुझे विश्वास नहीं है कि अपाचे के मूल लेख पर मूल रूप से django आपको लॉग इन करने का एक तरीका है। प्रमाणीकरण वास्तव में आवेदन स्तर पर किया जाना चाहिए क्योंकि यह आपको अधिक नियंत्रण देगा और यह आसान होगा। आप वास्तव में पायथन और अपाचे के बीच उपयोगकर्ता डेटा साझा करने की परेशानी नहीं चाहते हैं।

यदि आपको Django के पैच किए गए संस्करण का उपयोग करने में कोई फर्क नहीं पड़ता है तो http://www.djangosnippets.org/snippets/56/ पर एक पैच है जो आपको बुनियादी लेख का समर्थन करने के लिए कुछ मिडलवेयर देगा।

बेसिक ऑथ वास्तव में काफी सरल है - यदि उपयोगकर्ता लॉग इन नहीं है तो आप 401 प्रमाणीकरण आवश्यक स्थिति कोड लौटाते हैं। यह ब्राउज़र को लॉगिन बॉक्स प्रदर्शित करने के लिए संकेत देता है। ब्राउज़र फिर उपयोगकर्ता नाम और पासवर्ड को बेस 64 एन्कोडेड तारों के रूप में आपूर्ति करेगा। विकिपीडिया प्रविष्टि http://en.wikipedia.org/wiki/Basic_access_authentication बहुत अच्छी है।

यदि पैच जो भी आप चाहते हैं वह नहीं करता है तो आप मूल रूप से मूल रूप से अपने आप को लागू कर सकते हैं।

9

ओली के लिंक देखें। आप मूल रूप से प्रमाणीकृत उपयोगकर्ता नाम देखते हैं जैसा अनुरोध पर देखकर Django में मूल HTTP प्रमाणीकरण द्वारा सत्यापित किया गया है। एमएमटीए ['REMOTE_USER']।

अद्यतन: टिकट #689 के लिए प्रस्तावित पैच, जो उपलब्ध है परीक्षण अप-टू-डेट telenieko के Git भंडार here में। यह कम से कम Django के 9084 पर संशोधन पर लागू होता है।

, द्वारा

  • दूरदराज के उपयोगकर्ता प्रमाणीकरण बैकएंड RemoteUserAuthMiddleware के बाद AuthenticationMiddleware
  • की स्थापना AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.RemoteUserAuthBackend',)

जोड़ने आप की तरह मैं क्या lighttpd और FastCGI का उपयोग करते हैं जोड़ने सक्रिय mod_auth सक्रिय करते हैं, साख बनाने एक परीक्षण उपयोगकर्ता के लिए (मैं इसे testuser को फोन किया और पासवर्ड के रूप में 123 सेट) और Django साइट कॉन्फ़िगर बुनियादी प्रमाणीकरण की आवश्यकता होती है।

निम्नलिखित urls.py सेटअप का परीक्षण करने के लिए इस्तेमाल किया जा सकता है: तो lighty और Django FCGI सर्वर फिर से लोड करने के बाद

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')), 
) 

, साइट अब प्रमाणीकरण के लिए पूछता है की जड़ लोड हो रहा है और testuser क्रेडेंशियल्स स्वीकार करता है, और आउटपुट अनुरोध वस्तु का एक डंप। request.META में इन नए गुण मौजूद होना चाहिए:

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

/user/ URL की जाँच करने के लिए है कि आप वास्तव testuser रूप में प्रवेश किया इस्तेमाल किया जा सकता:

<User: testuser> 

और /users/ यूआरएल अब सूचीबद्ध करता है

admin,testuser 
: स्वचालित रूप से testuser (यहाँ admin उपयोगकर्ता जब syncdb कर भी दिखाया गया है मैं बनाया था) जोड़ा

आप Django पैच करने के लिए नहीं करना चाहते हैं, यह एक अलग मॉड्यूल में RemoteUserAuthBackend और RemoteUserAuthMiddleware वर्गों को अलग कर Django सेटिंग में वह उल्लेख करने के लिए तुच्छ है।

+0

इसके लिए धन्यवाद। अंत में मैंने आपके द्वारा सुझाए गए सुझावों को रिमोट यूसरऑथबैकेंड और रिमोट यूसरऑथ मिडलवेयर क्लास को अपने मॉड्यूल में रखा है जिसे मैंने settings.py में संदर्भित किया है और यह एक इलाज करता है। –

0

यह कस्टम AuthenticationBackend के लिए एक कार्य हो रहा है - Django documentation on this subject देखते हैं, djangosnippets.org इस तरह के कोड के कुछ वास्तविक जीवन उदाहरण है (1 या 2 देखें) (और यह वास्तव में एक कठिन बात नहीं है)।

AuthenticationBackend उप-वर्गों में केवल 2 विधियों को परिभाषित किया जाना चाहिए और उनका कोड बहुत सरल है: किसी को उपयोगकर्ता आईडी के लिए उपयोगकर्ता ऑब्जेक्ट वापस करना होगा, दूसरे को क्रेडेंशियल्स चेक करना होगा और क्रेडेंशियल मान्य होने पर उपयोगकर्ता ऑब्जेक्ट को वापस करना होगा।

29

सिर्फ कुछ अनुरोध पर मूल प्रमाणीकरण का समर्थन (और वेब सर्वर के साथ mucking नहीं - जो है कैसे किसी को अपने प्रश्न का शीर्षक में स्वीकार करे) के लिए, आप यहाँ देखने के लिए चाहते हैं:

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

+1

मैं के लिए, धन्यवाद वास्तव में क्या देख रहा था! –

+0

सरल और बस मुझे क्या चाहिए! – Daniel

+0

यह एक मरे हुए लिंक प्रतीत होता है। – epalm

संबंधित मुद्दे