Django

2009-07-11 21 views
24

में मीडिया फ़ाइलों के लिए लॉगिन की आवश्यकता कैसे है I साइट के उपयोगकर्ता पंजीकरण अनुभाग में डाउनलोड करने योग्य पीडीएफ और स्प्रेडशीट्स में "संवेदनशील" जानकारी की सेवा कर रहा हूं।Django

क्या इस मीडिया को सुरक्षित रखने के लिए django प्रमाणीकरण को के बिना सुरक्षित करने की अनुमति देने का कोई तरीका है (और मूल रूप से मूल ऑथ का उपयोग करके लॉगिन करना नहीं है)?

मैं थेरेस अनुमान लगा रहा हूँ (उंगलियों को पार कर) नहीं नीचे छद्म कोड के साथ यह करने के लिए एक तरह से है, लेकिन यह बेहतर अंतिम लक्ष्य उदाहरण देकर स्पष्ट करना मदद करता है।

#urls.py 
(r'^protected_media/(?P<filename>.*)$', 'protected_media') 

#views.py 
from django.contrib.auth.decorators import login_required 

@login_required 
def protected_media(request, filename): 
    # @login_required bounces you out to the login url 
    # if logged in, serve "filename" from Apache 

उत्तर

9

ऐसा लगता है कि आपके कोड में उल्लिखित विधि को काम करना चाहिए। यह वास्तव में किसी अन्य संरक्षित संसाधन से अलग नहीं है: आपके विचार डिस्क से फ़ाइलों, डेटाबेस से रिकॉर्ड, टेम्पलेट्स या कुछ भी प्रदान कर सकते हैं। जैसे ही login_required सजावट अन्य विचारों तक अनधिकृत पहुंच को रोकती है, यह आपके दृश्य सेवा संरक्षित मीडिया की ऐसी पहुंच को रोक देगा।

क्या मुझे यहां आपके प्रश्न से कुछ याद आ रही है? अगर यह मामला है तो कृपया स्पष्ट करें।

संपादित करें: अपनी टिप्पणी में django दस्तावेज़ लिंक के संबंध में: यह किसी विशेष निर्देशिका से किसी भी अनुरोध फ़ाइल की सेवा करने का तरीका है। तो, उस उदाहरण में यूआरएल /site_media/foo.jpg, /site_media/somefolder/bar.jpg स्वचालित रूप से और somefolder/bar.jpgdocument_root के अंतर्गत फ़ाइलों को देखेगा। असल में, document_root के तहत हर चीज सार्वजनिक रूप से उपलब्ध होगी। यह स्पष्ट रूप से असुरक्षित है। तो आप अपनी विधि से बचें।

इसे अक्षम माना जाता है क्योंकि डीजेंगो आपको बहुत अनावश्यक ओवरहेड जोड़ रहा है, जब आपको केवल यूआरएल अनुरोध लेने के लिए अपाचे की तरह कुछ और हार्ड ड्राइव पर फ़ाइल में मैप करना है। (आपको django सत्र, अनुरोध प्रसंस्करण इत्यादि की आवश्यकता नहीं है)

आपके मामले में, यह ऐसी बड़ी चिंता नहीं हो सकती है। सबसे पहले, आपने दृश्य सुरक्षित कर लिया है। दूसरा, यह आपके उपयोग पैटर्न पर निर्भर करता है। इन फ़ाइलों के लिए आप कितने अनुरोधों की उम्मीद करते हैं? आप केवल प्रमाणीकरण के लिए django का उपयोग कर रहे हैं - क्या यह अन्य ओवरहेड को औचित्य देता है? यदि नहीं, तो आप अपाचे के साथ उन फ़ाइलों की सेवा करने और प्रमाणीकरण प्रदाता का उपयोग करने में देख सकते हैं। इस बारे में अधिक के लिए, mod_wsgi दस्तावेज़ देखें: और Django के लिए खोज

समान mod_python के तहत उपलब्ध तंत्र रहे हैं मुझे विश्वास है। संपादित करें 2: (अपडेट सिर्फ अन्य जवाब देखा कृपया mod_python विधि के लिए आंद्रे के जवाब देखें।।)

:

send_file विधि एक फ़ाइलवापर का उपयोग करता है जो बड़ी स्थिर फ़ाइलों को वापस भेजने के लिए अच्छा है (यह पूरी फ़ाइल को स्मृति में नहीं पढ़ता है)।आपके द्वारा भेजे जा रहे फ़ाइल के प्रकार (पीडीएफ, जेपीजी, आदि) के आधार पर आपको content_type को बदलना होगा।

+0

अरे Ars, मुझे यह स्पष्ट करना चाहिए था कि मैं django दस्तावेज़ों से निम्नलिखित चिंता में मध्यस्थता करने की कोशिश कर रहा हूं: http://docs.djangoproject.com/en/dev/howto/static-files/#the-big -फैट-अस्वीकरण यदि psuedo-code की यह पंक्ति मान्य है, तो आप इसे कैसे पूरा करते हैं? # अगर लॉग इन है, तो अपाचे धन्यवाद से "फ़ाइल नाम" की सेवा करें! -टॉम – TomFuertes

+0

समझ गया; बस जवाब अद्यतन किया। उम्मीद है की यह मदद करेगा। – ars

1

यदि मैं आपके प्रश्न को सही ढंग से समझता हूं तो आप Django द्वारा सेवा नहीं की जा रही फ़ाइलों तक पहुंच प्रतिबंधित करना चाहते हैं, उदाहरण के लिए, अपाचे सर्वर के साथ?

इसके बाद आपको इस अपाचे सर्वर के लिए Django का प्रमाणीकरण स्रोत के रूप में उपयोग करने के लिए कुछ तरीका चाहिए।

यह django snippet ऐसी विधि का वर्णन करता है। यह Django में एक्सेस हैंडलर जो अपाचे द्वारा प्रयोग किया जाता है जब एक स्थिर फ़ाइल के लिए एक अनुरोध में है कि संरक्षित किए जाने की आवश्यकता आता है बनाता है:

<Location "/protected/location"> 
      PythonPath "['/path/to/proj/'] + sys.path" 
      PythonOption DJANGO_SETTINGS_MODULE myproj.settings 
     PythonOption DjangoPermissionName '<permission.codename>' 
     PythonAccessHandler my_proj.modpython #this should point to accesshandler 
      SetHandler None 
</Location> 

आशा इस मदद करता है, टुकड़ा थोड़ी देर पहले पोस्ट किया गया था, तो बातें हो सकता है Django संस्करणों के बीच बदल गया :)

3

Django के माध्यम से स्थिर फ़ाइलों की अधिक कुशल सेवा वर्तमान में Google SOC प्रोजेक्ट के हिस्से के रूप में देखी जा रही है। डब्लूएसजीआई के लिए यह उपलब्ध होने पर WSGI के लिए wsgi.file_wrapper एक्सटेंशन का उपयोग करेगा, क्योंकि यह mod_wsgi के लिए है, और req.sendfile() mod_python का उपयोग करते हुए। यह 'स्थान', 'एक्स-एक्सेल-रीडायरेक्ट' और अन्य जैसे शीर्षकों की वापसी का भी समर्थन करेगा, जो विभिन्न वेब होस्टिंग तंत्र और प्रॉक्सी फ्रंट सिरों को स्थैतिक फ़ाइलों की सेवा करने के साधन के रूप में स्वीकार करते हैं जहां स्थान बैकएंड वेब एप्लिकेशन द्वारा परिभाषित किया जाता है , जो स्थैतिक फाइलों की सेवा के लिए फ्रंट एंड के रूप में प्रभावशाली नहीं है।

मुझे यकीन नहीं है कि इसके लिए Django विकी में कहीं भी कोई प्रोजेक्ट पेज है या नहीं, लेकिन कोड परिवर्तन Django स्रोत कोड भंडार की शाखाओं/Soc2009/http-wsgi- सुधार शाखाओं में किए जा रहे हैं।

आपको उस सामान की कड़ाई से प्रतीक्षा करने की आवश्यकता नहीं है। यह सिर्फ विभिन्न तंत्रों में एक स्वच्छ और पोर्टेबल इंटरफेस लगा रहा है। यदि अपाचे/mod_wsgi के सामने nginx का फ्रंट एंड के रूप में उपयोग करना है, तो आप अब एक्स-एक्सेल-रीडायरेक्ट का उपयोग कर सकते हैं। यदि अपाचे/mod_wsgi 3.0 और डिमन मोड का उपयोग कर रहे हैं, तो आप अब स्थान का उपयोग कर सकते हैं, लेकिन यह सुनिश्चित करने की आवश्यकता है कि आप अपाचे को सही सेट अप करें। वैकल्पिक रूप से, आप फ़ाइल इंगित करने के लिए जो खुद से कुछ प्रतिक्रिया हेडर के लिए लग रहा है Django आवेदन वापस करने के चारों ओर अपने स्वयं के WSGI मिडलवेयर आवरण को लागू कर सकते हैं और जो wsgi.file_wrapper का उपयोग करता है वापस जाने के लिए है कि बजाय वास्तविक प्रतिक्रिया Django से लौट आए।

Btw, प्रमाणीकरण हुक दूसरों के द्वारा दोनों mod_python और mod_wsgi के लिए सूचीबद्ध तंत्र HTTP बुनियादी प्रमाणीकरण का उपयोग होता है, जो नहीं है कि तुम क्या चाहते थे। यह माना जाता है कि आप कुकीज़ और बैकएंड सत्रों का उपयोग करके Django फॉर्म आधारित लॉगिन तंत्र द्वारा फ़ाइलों को संरक्षित करना चाहते हैं।

4

अधिक जानकारी के लिए यह Django ticket पढ़ें। अपने आप को कुछ समय बचाने के लिए नीचे शुरू करें। ऐसा लगता है कि यह सिर्फ Django 1.2 में आने से चूक गया, और मुझे लगता है कि 1.3 में भी नहीं है।

Nginx के लिए, मुझे यह Django snippet मिला जो एक्स-एक्सेल-रीडायरेक्ट हेडर का लाभ उठाता है, लेकिन अभी तक इसे आजमाया नहीं है।