2011-07-02 19 views
18

मैं django के साथ डिफ़ॉल्ट प्रमाणीकरण प्रणाली का उपयोग कर रहा हूं, लेकिन मैंने ओपनआईडी लाइब्रेरी में जोड़ा है, जहां मैं ओपनआईडी के माध्यम से उपयोगकर्ताओं को प्रमाणीकृत कर सकता हूं। मैं उन्हें क्या करना चाहता हूं उन्हें लॉग इन करना है, लेकिन यह डिफ़ॉल्ट django ऑथ सिस्टम का उपयोग करने लगता है, मुझे उपयोगकर्ता को प्रमाणीकृत करने के लिए उनके पासवर्ड की आवश्यकता है। क्या वास्तव में उनके पासवर्ड का उपयोग किए बिना इसे पाने का कोई तरीका है?पासवर्ड के बिना django प्रमाणीकरण

मैं कुछ इस तरह करना चाहते हैं ...

user = ... # queried the user based on the OpenID response 
user = authenticate(user) # function actually requires a username and password 
login(user) 

मैं जल्दी ही बस authenticate समारोह को बंद रखना होगा, लेकिन यह एक backend क्षेत्र है, जो लॉगिन के लिए आवश्यक है जुड़ जाता है।

+0

[बिना पासवर्ड के उपयोगकर्ता में मैन्युअल रूप से लॉगिंग] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/2787650/manually-logging-in-a-user-without-password)। – easoncxz

उत्तर

2

आप आसानी से अपना authentication backend बनाकर इसे AUTHENTICATION_BACKENDS सेटिंग में जोड़कर आसानी से ठीक कर सकते हैं।

कुछ ओपनआईडी बैकएंड पहले से उपलब्ध हैं, इसलिए कुछ खोज के साथ आप स्वयं को लिखने की परेशानी बचा सकते हैं।

+0

मुझे django ओपनआईडी बैकएंड के साथ समस्याएं थीं क्योंकि वे ओपनआईडी करने के Google के अनोखे तरीके से संगत नहीं थे। वैसे भी, जैसा कि मैंने कहा था कि मेरे पास पहले से ही एक पासवर्ड-आधारित बैकएंड है और मैं कुछ मामलों में ओपनआईडी का उपयोग करना चाहता हूं - एक सख्त ओपनआईडी बैकएंड पर स्विच न करें। – voodoogiant

+0

@ voodoogiant: कीवर्ड तर्कों के आधार पर प्रमाणीकरण बैकएंड चुना जाता है। इसलिए यदि आप अपने ओपनआईडी बैकएंड के लिए 'openid_token' का उपयोग करते हैं और' सामान्य 'प्रमाणीकरण प्रणाली के लिए' पासवर्ड 'के साथ' उपयोगकर्ता नाम 'का उपयोग करते हैं, तो वे दोनों काम करेंगे। – Wolph

8

यह एक हैक का एक सा है, लेकिन आप अपने प्रयोक्ता वस्तु होगा पुनर्लेखन के लिए सामान की एक गुच्छा प्रमाणित उपयोगकर्ता

user.backend = 'django.contrib.auth.backends.ModelBackend' 
login(request, user) 

को दूर नहीं करना चाहते हैं

+4

यह एक संभावित समाधान है, लेकिन यह सत्र में संग्रहीत नहीं होता है, इसलिए यदि आप एक नया टैब खोलते हैं और साइट पर जाते हैं, तो आपको दोबारा लॉग इन करना होगा। – voodoogiant

+1

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

+0

@ voodoogiant, मैं बिल्कुल एक ही मुद्दे से मिला, यह सत्र संग्रहीत नहीं है। लेकिन अजीब पर्याप्त, पहले 2 एक्सएचआर अनुरोध सत्र-आईडी से सत्र डेटा सही ढंग से प्राप्त कर सकते थे। लेकिन बाद में एक्सएचआर अनुरोध नहीं करता है, और Django सर्वर कुकी में सत्र-आईडी सेट में रिक्त स्ट्रिंग पर सेट करता है। तुम जानते हो क्यों? और इसे कैसे हल करें? – jcyrss

19

यह एक कस्टम लिखने के लिए सीधा है इसके लिए प्रमाणीकरण बैकएंड। आप निम्नलिखित सामग्री के साथ/auth_backend.py yourapp बनाते हैं:

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 


class PasswordlessAuthBackend(ModelBackend): 
    """Log in to Django without providing a password. 

    """ 
    def authenticate(self, username=None): 
     try: 
      return User.objects.get(username=username) 
     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 = (
    # ... your other backends 
    'yourapp.auth_backend.PasswordlessAuthBackend', 
) 

, अब आप एक पासवर्ड के बिना प्रमाणित कॉल कर सकते हैं:

user = authenticate(username=user.username) 
login(request, user) 
+12

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

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