2011-03-21 11 views
7

मैं Django के लिए एक कस्टम प्रमाणीकरण बैकएंड का उपयोग कर रहा हूं (जो couchdb चलाता है)। मेरे पास एक कस्टम उपयोगकर्ता मॉडल है।Django, request.user हमेशा बेनामी उपयोगकर्ता

लॉगिन के हिस्से के रूप में, मैं request.user = user कर रहा हूं और सत्र में उपयोगकर्ता आईडी को सहेज रहा हूं। हालांकि, बाद के अनुरोधों पर मैं request.user को पुनः प्राप्त करने में सक्षम नहीं हूं। यह हमेशा एक अनाम उपयोगकर्ता है। हालांकि मैं सत्र से उपयोगकर्ता आईडी पुनर्प्राप्त कर सकता हूं और पुष्टि कर सकता हूं कि सत्र कुकी सही ढंग से सेट की जा रही है।

मुझे क्या याद आ रही है?

मैं एक रिलेशनल डीबी का उपयोग नहीं करना चाहता क्योंकि मैं अपने सभी उपयोगकर्ता डेटा को कॉचडब में रखना चाहता हूं।

संपादित करें: मैंने एक कक्षा लिखी है जो Django के लेखक उपयोगकर्ता से प्राप्त नहीं है। हालांकि इसमें उपयोगकर्ता नाम और ईमेल विशेषताएं हैं। इस कारण से, मेरा बैकएंड एक वर्ग को वापस नहीं करता है जो उपयोगकर्ता उपयोगकर्ता से प्राप्त होता है।

उत्तर

1

कृपया विस्तृत करें। यदि आप एक कस्टम उपयोगकर्ता मॉडल (जो एक कस्टम उपयोगकर्ता प्रोफाइल मॉडल से अलग है) का उपयोग कर रहे हैं, तो आप मूल रूप से अपने आप पर हैं और django.contrib.auth फ्रेमवर्क प्रमाणीकरण के साथ आपकी सहायता नहीं कर सकता है। यदि आप अपनी खुद की प्रमाणीकरण प्रणाली लिख रहे हैं और django.contrib.auth का उपयोग नहीं कर रहे हैं, तो आपको इसे बंद करना होगा क्योंकि ऐसा लगता है कि यह आपके सिस्टम में हस्तक्षेप कर रहा है।

+0

कृपया संपादित करें देखें। –

4

आप कहते हैं कि आपने कस्टम प्रमाणीकरण बैकएंड लिखा है, लेकिन वास्तव में जो आपने लिखा है वह एक पूर्ण कस्टम प्रमाणीकरण ऐप है, जो Django के contrib.auth के साथ इंटरफ़ेस नहीं करता है।

यदि आप अपने प्रमाणीकरण डेटा के लिए एक गैर-रिलेशनल डेटाबेस का उपयोग करना चाहते हैं, तो आपको केवल एक वर्ग बनाना है जो दो विधियों को प्रदान करता है: get_user(user_id) और authenticate(**credentials)the documentation देखें। एक बार जब आप किसी उपयोगकर्ता को प्रमाणित कर लेते हैं, तो आप बस Django की सामान्य लॉगिन विधियों को कॉल करते हैं। request.user मैन्युअल रूप से सेट करने या सत्र में कुछ भी डालने का कोई कारण नहीं होना चाहिए।

संपादित करने के बाद अद्यतन इसका इसके साथ कुछ लेना देना नहीं है। उपयोगकर्ता की कक्षा auth.models.User से प्राप्त होने की कोई आवश्यकता नहीं है। आपको अभी भी get_user विधि को परिभाषित करने की आवश्यकता है जो आपके उपयोगकर्ता वर्ग का एक उदाहरण लौटाएगा।

+0

कृपया संपादित करें देखें। –

9

request.userdjango.contrib.auth.middleware.AuthenticationMiddleware द्वारा सेट किया गया है।

चेक django/contrib/auth/middleware.py:

class LazyUser(object): 
    def __get__(self, request, obj_type=None): 
     if not hasattr(request, '_cached_user'): 
      from django.contrib.auth import get_user 
      request._cached_user = get_user(request) 
     return request._cached_user 

class AuthenticationMiddleware(object): 
    def process_request(self, request): 
     request.__class__.user = LazyUser() 
     return None 

फिर django/contrib/auth/__init__.py में get_user समारोह को देखने के:

def get_user(request): 
    from django.contrib.auth.models import AnonymousUser 
    try: 
     user_id = request.session[SESSION_KEY] 
     backend_path = request.session[BACKEND_SESSION_KEY] 
     backend = load_backend(backend_path) 
     user = backend.get_user(user_id) or AnonymousUser() 
    except KeyError: 
     user = AnonymousUser() 
    return user 

आपका बैकएंड get_user समारोह को लागू करने की आवश्यकता होगी।

+1

मैंने अपनी समस्या हल की है इन कोड उद्धरणों के लिए धन्यवाद। मेरा दिन बचाया! – yentsun

4

मेरे पास भी कस्टम प्रमाणीकरण बैकएंड है और सफल प्रमाणीकरण और लॉगिन के बाद हमेशा AnonymousUser मिला है। मेरे पास बैकएंड में विधि थी।क्या मैं याद आ रही थी था कि get_user केवल ईमेल द्वारा नहीं pk द्वारा उपयोगकर्ता प्राप्त करना होगा या जो कुछ भी authenticate में आपके क्रेडेंशियल्स हैं:

class AccountAuthBackend(object): 

@staticmethod 
def authenticate(email=None, password=None): 
    try: 
     user = User.objects.get(email=email) 
     if user.check_password(password): 
      return user 
    except User.DoesNotExist: 
     return None 

@staticmethod 
def get_user(id_): 
    try: 
     return User.objects.get(pk=id_) # <-- tried to get by email here 
    except User.DoesNotExist: 
     return None 

इसके डॉक्स में इस लाइन को याद करने के लिए आसान:

get_user विधि उपयोगकर्ता_आईडी लेता है - जो उपयोगकर्ता नाम, डेटाबेस आईडी या जो कुछ भी हो सकता है, लेकिन आपके उपयोगकर्ता ऑब्जेक्ट की प्राथमिक कुंजी होना चाहिए - और उपयोगकर्ता ऑब्जेक्ट देता है।

ऐसा हुआ कि email मेरी स्कीमा में प्राथमिक कुंजी नहीं है। उम्मीद है कि यह किसी को कुछ समय बचाता है।

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