2011-01-24 14 views
71

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

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

उत्तर

102

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

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

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

ध्यान दें कि अनुमतियों tuples का एक सेट है, जहां टपल आइटम अनुमति जैसा कि ऊपर वर्णित है और कहा कि अनुमति के विवरण के हैं: एक मॉडल को अधिक अनुमतियों को जोड़ने के लिए, कहते हैं पढ़ने के लिए अनुमतियां, आप मेटा वर्ग का उपयोग । आपको 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 

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

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

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

+21

यह अनुमतियों के लिए एक बड़ा जवाब है, लेकिन मुश्किल से समूहों को छूता है और वे Django में कैसे काम करते हैं? – Simon

+3

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

+0

ऐसा लगता है कि Django Advent चला गया है, गिटूब पर अपनी ऑब्जेक्ट अनुमतियां लिखने के बारे में आलेख का एक संस्करण है: https://github.com/djangoadvent/djangoadvent-articles/blob/master/1.2/06_object-permissions.rst –

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