使用多个数据库进行Django身份验证



我想为客户创建一个应用程序,每个客户都有自己的数据库。因此,作为登录信息,他们需要输入三个不同的字段:客户号、用户名和密码。

用户名和密码应该做正常的身份验证,客户号码在那里可以转到正确的数据库用户表进行身份验证。我可以通过using((函数转到其他数据库。

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 %}时,它都会转到默认数据库,并说user是Anonymous。我不知道解决这个问题的正确方法是我的解决方案错了吗?

好吧,在尝试了一些东西之后,我得到了一个解决方案,我认为它适用于第一步,但我不知道如果我像这样使用,是否存在安全问题或任何其他错误

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_uuser中调用该变量,那么这个解决方案是可以接受的还是存在一些风险?

最新更新