अपने खुद के प्रयोक्ता मॉडल के लिए प्रत्येक वस्तु अनुमति के लिए Django




permissions (2)

मैंने अपने खुद के उपयोगकर्ता मॉडल वर्ग को निम्नानुसार लागू किया है। ध्यान दें कि यह auth.User के auth.User मॉडल को अनुकूलित नहीं करता है। मैं इस ऑब्जेक्ट को अनुमति ज्ञान के लिए नया हूँ और खासकर इस स्वयं-परिभाषित यूजर मॉडल में जो कि मेरी परियोजना में आवश्यक है।

क्या आप इस मामले में प्रति-वस्तु की अनुमति जोड़ने का एक उदाहरण दे सकते हैं? बहुत सराहना की।

from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin

class CustomUser(AbstractBaseUser, PermissionsMixin):
         email = models.EmailField(max_length=40, unique=True)
         //.... other fields are omitted

class Article(models.Model):
    title = models.CharField('title', max_length=120)
    body = models.TextField('body')
    author = models.ForeignKey(CustomUser)

अब, ऑब्जेक्ट की अनुमति खेल में आता है। प्रत्येक उपयोगकर्ता अपने स्वयं के लेख ऑब्जेक्ट बना सकते हैं / अपडेट कर सकते हैं / हटा सकते हैं / देख सकते हैं, लेकिन केवल दूसरों के लेख को बिना अपडेट के / अपडेट करने के लिए देख सकते हैं।

डीजेंगो डॉक्स से, मॉडल स्तर की अनुमति यहां लागू नहीं होती है। अगर अनुच्छेद को मॉडल स्तर अपडेट अनुमति दी जाती है, तो सभी उपयोगकर्ता अन्य लेख अपडेट कर सकते हैं।

इसलिए, मुझे डीजेंगो-अभिभावक मिल गया हालांकि, इस स्वयं-परिभाषित कस्टमउज़र मॉडल के लिए कोई उम्मीद नहीं है, क्योंकि यह auth.User के auth.User पर काफी निर्भर है। auth.User मॉडल!

https://django-guardian.readthedocs.org/en/v1.2/userguide/custom-user-model.html

अद्यतन करें:

  1. मेरा मामला एबब्रेटयूसर की जगह ऐबबेटबेस यूसर उप-क्लासिंग है;
  2. यह व्यवस्थापक के लिए नहीं बल्कि केवल अपने बैकएंड कोड तर्क के लिए है;
  3. मैं यहां Django REST API का उपयोग नहीं कर रहा हूं, लेकिन यदि REST API उचित है, तो कृपया एक उदाहरण दें।

आपके द्वारा पोस्ट किए गए प्रलेखन पृष्ठ में , यह भी कहा गया है:

असल में, यदि हम एबसट्रसर्स को उप-वर्ग करते हैं या auth.Group के साथ कई-से-कई रिश्ते को परिभाषित करते हैं (और रिवर्स से संबंधित नाम समूह देते हैं) तो हमें ठीक होना चाहिए।

चूंकि यह वही है जो आप कर रहे हैं, आपको AUTH_USER_MODEL को जेंगो डॉक्यूमेंटेशन में लिखा गया होना चाहिए (यह भी टिकट और डीजेंगो 1.5 संगतता के लिए प्रतिबद्ध कोड देखें )।


ऑब्जेक्ट-स्तरीय अनुमतियों को डीजेंगो में नहीं बनाया गया है, यहां तक ​​कि मानक auth.User मॉडल का उपयोग करते समय। लेकिन फाउंडेशन में उस डीजेंगो के PermissionsMixin has_perm में है has_perm विधि को परिभाषित करता है, जो मॉडल उदाहरण को स्वीकार करता है। डिफ़ॉल्ट रूप से Django इसके साथ कुछ नहीं करता है, लेकिन आप कर सकते हैं

has_perm विधि प्रभावी तरीके से पंजीकृत प्रमाणीकरण बैकएंड पर कड़ी मेहनत से गुजरती है। इसलिए आप विशेष रूप से अपने ऑब्जेक्ट-स्तरीय अनुमति जांच के लिए एक कस्टम प्रमाणीकरण बैकेंड बना सकते हैं। यह वास्तव में प्रमाणीकरण को संभालने की आवश्यकता नहीं है यह एक बुनियादी वर्ग पर एक ही विधि के रूप में सरल हो सकता है। निम्नलिखित की तरह कुछ (untested) आप सभी की जरूरत है चाहिए:

class ObjectPermissionsBackend(object):

    def has_perm(self, user_obj, perm, obj=None):
        if not obj:
            return False # not dealing with non-object permissions

        if perm == 'view':
            return True # anyone can view
        elif obj.author_id == user_obj.pk:
            return True
        else:
            return False

अपने कस्टम बैकएंड का उपयोग करने के लिए AUTHENTICATION_BACKENDS सेटिंग का उपयोग करने के लिए Django को बताएं। Settings.py में

AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend', 'path.to.ObjectPermissionsBackend')

फिर, आपके कोड में:

if user.has_perm('edit', article_instance):
    # allow editing

Https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#custom-users-and-permissions और https://docs.djangoproject.com/en/1.8/topics/auth/customizing/ देखें # निर्दिष्ट करने प्रमाणीकरण-बैकेंड