मैं ग्राहकों के लिए एक ऐप बनाना चाहता हूं जहां प्रत्येक ग्राहक का अपना डीबी हो। इसलिए लॉगिन जानकारी के रूप में उन्हें तीन अलग-अलग फ़ील्ड दर्ज करने की आवश्यकता होती है: ग्राहक संख्या, उपयोगकर्ता नाम, पासवर्ड।

उपयोगकर्ता नाम और पासवर्ड को सामान्य प्रमाणीकरण सामग्री करनी चाहिए और प्रमाणीकरण के लिए सही डेटाबेस उपयोगकर्ता तालिका में जाने के लिए ग्राहक संख्या है, मैं उपयोग () फ़ंक्शन के माध्यम से अन्य डेटाबेस पर जा सकता हूं।

class CustomAuthBackend(ModelBackend):

def authenticate(self, request, username=None, password=None, **kwargs):
    user = CustomUser.objects.using(request.POST['kundennr']).get(username=username)
    if user.check_password(password) and self.user_can_authenticate(user) :
         try:
            user = CustomUser.objects.using(request.POST['kundennr']).get(username=username)
            return user
         except User.DoesNotExist:
            return None

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

प्रमाणीकरण फ़ंक्शन ठीक काम करता है जिस तरह से मेरे पास समस्या है get_user फ़ंक्शन मुझे लगता है क्योंकि get_user फ़ंक्शन का कोई अनुरोध नहीं है जहां मैं परिभाषित कर सकता हूं कि इसे किस डेटाबेस पर कॉल करना चाहिए। क्योंकि हर बार जब मैं {% if user.is_authenticated %} को कॉल करता हूं तो यह डिफ़ॉल्ट डेटाबेस में जाता है और कहता है कि उपयोगकर्ता बेनामी है। मुझे नहीं पता कि इस समस्या को हल करने का सही तरीका क्या मेरा समाधान गलत है?

1
Le-Hao Nguyen 21 नवम्बर 2018, 13:57

1 उत्तर

सबसे बढ़िया उत्तर

ठीक है कुछ सामानों की कोशिश करने के बाद मुझे एक समाधान मिला जो मुझे लगता है कि पहले चरण के लिए काम करता है लेकिन मुझे नहीं पता कि सुरक्षा समस्याएं हैं या कोई अन्य त्रुटियां हैं अगर मैं इसे इस तरह उपयोग करता हूं

from app.models import CustomUser
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth import login as auth_login
from app.middleware import ThreadLocal

class CustomAuthBackend(ModelBackend):

def authenticate(self, request, username=None, password=None, **kwargs):
    user = CustomUser.objects.using(request.POST['kundennr']).get(username=username)
    if user.check_password(password) and self.user_can_authenticate(user) :
         try:
            user = CustomUser.objects.using(request.POST['kundennr']).get(username=username)
            request.session['kundennr']=request.POST['kundennr']
            return user
         except User.DoesNotExist:
            return None

def get_user(self, user_id):
    try:
        request = ThreadLocal.get_current_request()
        return CustomUser.objects.using(request.session['kundennr']).get(pk=user_id)
    except User.DoesNotExist:
        return None

मैंने मिडलवेयर में एक ThreadLocal.py आयात किया ताकि मैं get_user में अनुरोध ऑब्जेक्ट प्राप्त कर सकूं और जब मैं लॉगिन करता हूं तो मैं ग्राहक को सत्र चर में सहेजता हूं जिसे मैं get_user में कॉल करता हूं तो क्या यह समाधान स्वीकार्य है या क्या कुछ जोखिम हैं?

1
Le-Hao Nguyen 21 नवम्बर 2018, 13:03