2013-06-12 8 views
9

यहां गंभीर सहायता की आवश्यकता है।Django एकाधिक प्रमाणीकरण एक परियोजना के लिए बैकएंड, कैसे?

मेरे पास django/पायथन में एक आवेदन लिखा गया है और मुझे इसे विस्तारित करना है और इस एप्लिकेशन में "ऐप" के रूप में कुछ अन्य समाधान शामिल करना है। उदाहरण के लिए मेरा ऐप एकीकृत करने के लिए "my_new_app" नाम दिया गया है अब मुख्य एप्लिकेशन के लिए बैकएंड प्रमाणीकरण लिखा गया है और मैं इसका उपयोग नहीं कर सकता। मेरे पास क्वेरी करने के लिए एक mysql डीबी है और मुख्य ऐप ज्यादातर कैसेंडर और रेडिस का उपयोग करता है। तो मेरा सवाल यह है कि, क्या मैं किसी भी तरह से नए ऐप "my_new_app" के लिए एक अलग प्रमाणीकरण बैकएंड का उपयोग कर सकता हूं और दोनों को एक ही डोमेन में चला सकता हूं? प्रश्न स्पष्ट नहीं हो सकता है, अगर पूछा गया तो मैं स्पष्ट कर दूंगा।

उत्तर

24

आप में कई प्रमाणीकरण बैकएंड हैं। अपने Django प्रोजेक्ट के settings.py में AUTHENTICATION_BACKENDS को बैकएंड कार्यान्वयन की सूची बनाने के लिए बस सेट करें। उदाहरण के लिए मैं अक्सर अपनी settings.py में OpenID प्रमाणीकरण और मानक Django प्रमाणीकरण, इस तरह के संयोजन का उपयोग:

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'django_openid_auth.auth.OpenIDBackend', 
    ) 

इस उदाहरण में Django पहले django.contrib.auth.backends.ModelBackend, जो Django के डिफ़ॉल्ट बैकएंड है का उपयोग कर प्रमाणित करने के लिए कोशिश करेंगे। यदि यह विफल रहता है, तो यह अगले बैकएंड पर चलता है, django_openid_auth.auth.OpenIDBackend

ध्यान दें कि आपकी कस्टम बैकएंड्स Django द्वारा दिखाई देने वाले पथ पर होना चाहिए। इस उदाहरण में मुझे django_openid_authINSTALLED_APPS में जोड़ना होगा, अन्यथा Django इसे आयात करने में सक्षम नहीं होगा और इसे बैकएंड के रूप में उपयोग नहीं करेगा।

भी प्रासंगिक दस्तावेज पढ़ें, यह बहुत अच्छी तरह से, लिखा है समझने में आसान: https://docs.djangoproject.com/en/dev/topics/auth/customizing/

4

मैंने पहले इस समस्या के माध्यम से किया गया है। यह वह कोड है जिसका मैंने उपयोग किया था।

यह API/backend.py

from django.contrib.auth.models import User 


class EmailOrUsernameModelBackend(object): 

    def authenticate(self, username=None, password=None): 
     if '@' in username: 
      kwargs = {'email': username} 
     else: 
      kwargs = {'username': username} 
     try: 
      user = User.objects.get(**kwargs) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 

पर प्रमाणीकरण बैकएंड है और ये मेरे settings.py

AUTHENTICATION_BACKENDS = (
    'api.backend.EmailOrUsernameModelBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 

आशा है कि यह मदद करता है। कृपया मुझे बताएं कि क्या आप अभी भी परेशानी में हैं। यह कोड आपको Django व्यवस्थापक में भी डिफ़ॉल्ट Django उपयोगकर्ता प्रमाणीकृत करने के लिए ईमेल का उपयोग करने में सक्षम करेगा।

+0

हालांकि आपका समाधान भी अच्छा है लेकिन यह ठीक से संबोधित नहीं करता है कि मैं क्या चाहता हूं, मैं कुछ घंटों में अपना समाधान पोस्ट करूंगा। बीटीडब्ल्यू मुझे आपके समाधान से विचार मिला है, इसलिए यहां आपको +1 है। –

+0

उपयोगकर्ता नाम में 'if' @ 'का उपयोग करके: यह पहचानने के लिए कि उपयोगकर्ता नाम एक ईमेल है या नहीं, अगर उपयोगकर्ता नाम में '@' हो सकता है तो इसे प्राप्त करने का एक बहुत बुरा तरीका है।आपको कम से कम पैटर्न मिलान का उपयोग करना चाहिए या स्रोत पर चुने गए विकल्प की पहचान करनी चाहिए। – vintagexav

+1

इसके बजाय 'अगर '@' उपयोगकर्ता नाम में:', 'इस तरह django.core.validators.validate_email' का उपयोग करें: ' डीईएफ़ validateEmail (ईमेल): कोशिश: validate_email (ईमेल) वापसी सच ValidationError को छोड़कर: वापसी False' –

2

एकाधिक बैकएंड प्रमाणीकरण का उपयोग करना पाई के समान सरल है। आपको सिर्फ Django ऐप्स के वर्कफ़्लो को समझने की आवश्यकता है।

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.Backend1', 
    'django_openid_auth.auth.Backend2', 
    ) 

उदाहरण के लिए आपके पास निम्नलिखित दो बैकएंड परिभाषित हैं। Django पहले बैकएंड में पहली बार जाएगा और आपको उस बैकएंड में कुछ तर्क डालना होगा ताकि अगर वह उस बैकएंड से संबंधित न हो तो उसे अन्य बैकएंड में भेज दिया जाए या बिना किसी परिणाम के लौटा दिया जाए। किसी भी परिणाम के मामले में django स्वचालित रूप से अनुरोध को पहले बैकएंड से दूसरे स्थान पर ले जाएगा और यदि तीसरा उपलब्ध होगा। मैं इस पर बहुत समय बिताता हूं और पाया कि यह जटिल नहीं था।

+0

मुझे समझ में नहीं आ रहा है कि आपने एक उत्तर पोस्ट क्यों किया है जो मेरे जैसा ही है, 2 सप्ताह पहले पोस्ट किया गया था ... :( – janos

+0

असल में दोस्त मैं ठीक से नहीं मिला जो आप कहना चाहते थे, इसलिए मैंने आपका पीछा किया जवाब दिया और मेरे और वोला के कुछ जादू किए। आपका जवाब अच्छा है। अगर आप हमारे दोनों उत्तरों में शामिल हो जाते हैं और नीचे एक और डाल देते हैं तो यह इस मुद्दे पर सबसे अच्छा जवाब होगा। शुभकामनाएं –

+0

आप मुझे एक टिप्पणी छोड़ सकते थे , मैंने स्पष्ट किया होगा ;-) मैंने इसे अभी स्पष्ट किया है, आपको क्या लगता है? अगर आपको अभी भी लगता है कि इसे संशोधित किया जाना चाहिए तो मुझे बताएं। – janos

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