2013-02-14 41 views
5

एक आखिरी बात है कि मैं के साथ थोड़ा उलझन में हूं और यह अनुमति कक्षाओं और प्रमाणीकरण कक्षाओं के बीच अलग है।अनुमति कक्षाओं और प्रमाणीकरण कक्षाओं के बीच Django REST अंतर

इस मेरी settings.py

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAdminUser', 


), 
'DEFAULT_AUTHENTICATION_CLASSES': (
    'rest_framework.authentication.TokenAuthentication', 
    'rest_framework.authentication.SessionAuthentication', 
), 
'PAGINATE_BY': 10 

}

है और मैं निम्नलिखित है मेरे विचार में ...

class ProfileList(generics.ListCreateAPIView): 
    """ 
    API endpoint that represents a list of users. 
    """ 
    permission_classes = (permissions.IsAdminUser,) 
    model = Profile 
    serializer_class = ProfileSerializer 

    def pre_save(self, obj): 
     obj.owner = self.request.user 

मुझे किसके साथ क्या होगा ग्रहण किया उपर्युक्त यह है कि केवल व्यवस्थापक उपयोगकर्ताओं को ब्राउज़र योग्य एपीआई तक पहुंच थी, जबकि एक वैध टोकन वाले उपयोगकर्ता जी भी कर सकते थे और जेसन अनुरोध। हालांकि, यह मामला केवल इतना ही नहीं है कि प्रमाणीकृत उन्हें एक्सेस प्रदान करता है लेकिन = यह और अभी भी मेरे उपयोगकर्ताओं को लॉग इन होने पर ऑनलाइन संस्करण तक पहुंचने की इजाजत देता है।

मैं अपने सभी उपयोगकर्ताओं को पहुंच प्राप्त करने के लिए वैध टोकन के साथ चाहता हूं, लेकिन केवल व्यवस्थापक उपयोगकर्ताओं को सत्रों के साथ ऑनलाइन एपीआई संस्करण देखने की अनुमति है, क्या यह संभव है?

उत्तर

6

मैं अपने सभी उपयोगकर्ताओं को पहुंच प्राप्त करने के लिए वैध टोकन के साथ चाहता हूं, लेकिन केवल व्यवस्थापक उपयोगकर्ताओं को सत्रों के साथ ऑनलाइन एपीआई संस्करण देखने की अनुमति है, क्या यह संभव है?

ध्यान देने योग्य पहली बात यह है कि ब्राउज़ करने योग्य एपीआई आपके उपयोगकर्ताओं को जेएसओएन को केवल प्रस्तुत करने के मुकाबले ज्यादा अनुमति नहीं देगी। एपीआई एंडपॉइंट्स पर यह सिर्फ एक बहुत अच्छा विचार है। व्यक्तिगत रूप से मैं आमतौर पर ब्राउज़ करने योग्य एपीआई को अंत-डेवलपर्स के सामने बेनकाब करना चाहता हूं क्योंकि यह एपीआई के खिलाफ आसान बनाता है।

तुम सच में हर किसी से छिपा छोड़कर व्यवस्थापक उपयोगकर्ताओं यहाँ दो दृष्टिकोण आप अपना सकते हैं चाहते हैं:

  1. अवहेलना दृश्य पर get_renderers() विधि। (संक्षेप में here दस्तावेज) आप self.request.user.is_staff देख सकते हैं, और केवल ब्राउज़ करने योग्य API रेंडरर को शामिल कर सकते हैं यदि यह एक व्यवस्थापक उपयोगकर्ता है।

  2. ब्राउज़ करने योग्य एपीआई रेंडरर को उपclass, और .render() ओवरराइड करें। (उदाहरण के लिए here) आप renderer_context['request'] का उपयोग कर आने वाले अनुरोध प्राप्त कर सकते हैं, और यदि यह व्यवस्थापक उपयोगकर्ता नहीं है तो बस मानक JSON को प्रस्तुत करें।

1

मैं the docs में वर्णित के रूप यह काम करता है लगता है: किसी भी अनुमति की जांच में विफल रहता है एक exceptions.PermissionDenied अपवाद बढ़ा दी जाएगी, और

तो देखने के मुख्य शरीर नहीं चलेंगे।

यदि आप IsAdminUser सेट करते हैं, तो उपयोगकर्ता को एक व्यवस्थापक होना चाहिए। अन्यथा उसे अनुमति नहीं होगी, भले ही DEFAULT_AUTHENTICATION_CLASSES में आवश्यक सभी चीजें प्रदान की जाएं।