具有多个数据库的Django身份验证

时间:2018-11-21 10:57:12

标签: django authentication multiple-databases

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

用户名和密码应该执行常规的身份验证工作,并且customernumber可以转到正确的数据库用户表进行身份验证,我可以通过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 %}时,它都会转到默认数据库,并说用户是匿名的。 我不知道解决这个问题的正确方法是我的解决方案就是错吗?

1 个答案:

答案 0 :(得分:0)

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

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中调用的会话变量中,那么此解决方案是否可以接受?或者存在某些风险吗?