मैं Django समूहों और अनुमतियों का उपयोग कैसे करूं?


83

मैं मूल उपयोगकर्ता सामग्री को समझता हूं। मैं प्रमाणीकरण, लॉगिन, खाते बनाना आदि जानता हूं, लेकिन अब मैं समूहों और अनुमतियों पर काम करना चाहता हूं।

Django समूहों / अनुमतियों के लिए प्रलेखन कहाँ है? यह यह नहीं है: http://docs.djangoproject.com/en/dev/topics/auth/

जवाबों:


121

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

मॉडल की अनुमतियों के लिए, Django आपके लिए इन्हें संभालता है ... ज्यादातर। प्रत्येक मॉडल के लिए Django फॉर्म में 'appname.permissionname_modelname' की अनुमति देगा। यदि आपके पास कार मॉडल के साथ 'ड्राइवर' नामक एक ऐप है, तो एक अनुमति 'ड्राइवर.डेली_कार' होगी। Django द्वारा स्वचालित रूप से बनाई गई अनुमतियाँ बनाई जाएंगी, बदल जाएंगी, और हट जाएंगी। कुछ अजीब कारणों से उन्होंने सीआरयूडी से पढ़ने की अनुमति शामिल नहीं करने का फैसला किया, आपको यह खुद करना होगा। ध्यान दें कि Django ने किसी कारण से CRUD के 'अपडेट' को 'परिवर्तन' में बदलने का फैसला किया। किसी मॉडल में और अनुमतियाँ जोड़ने के लिए, अनुमतियाँ पढ़ें, आप मेटा क्लास का उपयोग करते हैं:

class Car( models.Model ):
    # model stuff here
    class Meta:
        permissions = ( 
            ( "read_car", "Can read Car" ),
        )

ध्यान दें कि अनुमतियाँ tuples का एक समूह है, जहाँ tuple आइटम ऊपर वर्णित अनुमति और उस अनुमति का विवरण है। आपको permname_modelname कन्वेंशन का पालन करने की आवश्यकता नहीं है, लेकिन मैं आमतौर पर इसके साथ रहता हूं।

अंत में, अनुमतियों की जांच करने के लिए, आप has_perm का उपयोग कर सकते हैं:

obj.has_perm( 'drivers.read_car' )

जहां obj या तो उपयोगकर्ता या समूह का उदाहरण है। मुझे लगता है कि इसके लिए एक फ़ंक्शन लिखना आसान है:

def has_model_permissions( entity, model, perms, app ):
    for p in perms:
        if not entity.has_perm( "%s.%s_%s" % ( app, p, model.__name__ ) ):
            return False
    return True

जहां इकाई (समूह या उपयोगकर्ता) पर अनुमतियों की जांच करने के लिए ऑब्जेक्ट है, मॉडल एक मॉडल का उदाहरण है, परमिट की जांच करने के लिए स्ट्रिंग की अनुमति के रूप में एक सूची है (जैसे ['पढ़ा', 'परिवर्तन')), और ऐप है एक स्ट्रिंग के रूप में आवेदन नाम। ऊपर के रूप में has_perm की जाँच करने के लिए आप कुछ इस तरह से कॉल करेंगे:

result = has_model_permissions( myuser, mycar, ['read'], 'drivers' )

यदि आपको ऑब्जेक्ट या पंक्ति अनुमतियों का उपयोग करने की आवश्यकता है (उनका मतलब एक ही बात है), तो Django वास्तव में आपकी स्वयं की मदद नहीं कर सकता है। अच्छी बात यह है कि आप मॉडल और ऑब्जेक्ट परमिशन दोनों को एक साथ इस्तेमाल कर सकते हैं। यदि आप ऑब्जेक्ट अनुमतियाँ चाहते हैं, तो आपको या तो अपना स्वयं का लिखना होगा (यदि 1.2+ का उपयोग करके) या किसी अन्य व्यक्ति द्वारा लिखे गए प्रोजेक्ट को ढूंढना है, तो मुझे जो पसंद है वह है django-objectpermissions from washtontimes


27
यह अनुमतियों के लिए एक महान उत्तर है, लेकिन समूह को मुश्किल से छूता है और वे कैसे Django में काम करते हैं?
NotSimon

4
समूहों के लिए एक बहुत कुछ नहीं है, वे ज्यादातर उपयोगकर्ताओं को एक साथ अनुमतियों को लागू करने के लिए, लिनक्स उपयोगकर्ता समूहों की तरह बहुत कुछ करते हैं। आप किसी समूह को अनुमति देते हैं और यह उस समूह के सभी सदस्यों तक विस्तृत होता है। प्रलेखन यह कहता है कि सब सच: docs.djangoproject.com/en/dev/topics/auth/default/#groups
एलेक्स कुहल

1
मैं यहाँ इंगित करने के लिए मजबूर हूँ कि आप इसके लिए django अभिभावक का उपयोग करने पर विचार करना चाहते हैं । यहां प्राधिकरण पैकेज ब्रेकडाउन देखें । इसके अलावा यह SOF लिंक एक अच्छी तुलना प्रदान करता है।
जेफ शेफील्ड

1
जैसा कि मैंने इसे पार किया और वस्तु अनुमति की आवश्यकता थी, मुझे django-guardian मिला: django-guardian.readthedocs.org/en/v1.2
dArignac

1
'अपनी खुद की लिखो' नीचे है। या कुछ और। यह अब चीनी में है।
विलियम कार्लसन ने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.