2012-09-03 20 views
6

मैं Tastypie 0.9.11 का उपयोग कर रहा हूं और मैं अनधिकृत उपयोगकर्ताओं को एक ही समय में एपीआई को केवल पढ़ने की अनुमति की अनुमति देना चाहता हूं, यदि कोई उपयोगकर्ता एक एपीआई कुंजी प्रमाणीकरण के साथ प्रमाणित करता है, वह उपयोगकर्ता उन मॉडलों पर जोड़/परिवर्तन/हटा सकता है।Tastypie - अधिकृत लेखन अनुमतियों को देकर अनधिकृत उपयोगकर्ताओं के लिए केवल पढ़ने के लिए अनुमति दें

एपीआई कुंजी प्रमाणीकरण का उपयोग करना + Django प्रमाणीकरण आवश्यकता 1 को पूरा नहीं करता है (अनधिकृत उपयोगकर्ता एपीआई तक नहीं पहुंच सकते हैं)। कोई प्रमाणीकरण का उपयोग करने से उपयोगकर्ता एपीआई कुंजी के साथ प्रमाणित नहीं होने देता है (जो आवश्यकता 2 को पूरा नहीं करता है)।

मुझे यकीन है कि इस व्यवहार को प्राप्त करने का एक आसान तरीका है, कृपया मदद करें।

बहुत धन्यवाद, युवाल कोहेन

उत्तर

8

वहाँ दो चीजें हैं जो आप विचार करने की जरूरत है। सत्यापन और प्राधिकरण।

सबसे पहले आपको सभी उपयोगकर्ताओं को प्रमाणित करने की आवश्यकता है चाहे अनुरोध विधि प्राप्त हो तो एपीआई कुंजी चाहे कोई फर्क नहीं पड़ता, अन्य सभी विधियों के लिए ApiKey प्रमाणीकरण का उपयोग करें।

अब, सभी प्रमाणीकृत उपयोगकर्ता प्राधिकरण के अधीन हैं। यहां आपको यह सुनिश्चित करने की भी आवश्यकता है कि जीईटी अनुरोधों की हमेशा अनुमति है। कुछ इस तरह हो कि आप आरंभ करना चाहिए:

from tastypie.resources import ModelResource 
from tastypie.authentication import ApiKeyAuthentication 
from tastypie.authorization import DjangoAuthorization 

class MyAuthentication(ApiKeyAuthentication): 
    """ 
    Authenticates everyone if the request is GET otherwise performs 
    ApiKeyAuthentication. 
    """ 

    def is_authenticated(self, request, **kwargs): 
     if request.method == 'GET': 
      return True 
     return super(MyAuthentication, self).is_authenticated(request, **kwargs) 

class MyAuthorization(DjangoAuthorization) 
    """ 
    Authorizes every authenticated user to perform GET, for all others 
    performs DjangoAuthorization. 
    """ 

    def is_authorized(self, request, object=None): 
     if request.method == 'GET': 
      return True 
     else: 
      return super(MyAuthorization, self).is_authorized(request, object) 

class MyResource(ModelResource): 

    class Meta: 
     authentication = MyAuthentication() 
     authorization = MyAuthorization() 

तो मूल रूप से ApiKeyAuthentication और DjangoAuthorization प्रयोग करने के लिए अपने दृष्टिकोण केवल प्राप्त अनुरोधों के लिए विशेष उपचार का अभाव है।

+0

विस्तृत समाधान के लिए धन्यवाद। यह अच्छा काम करता है। मैंने MyAuthorization को छोड़ दिया क्योंकि DjangoAuthorization पहले से ही GET अनुरोधों को अनुमति देता है। –

+0

आपका स्वागत है :) मुझे खुशी है कि यह काम करता है। – kgr