我想为客户创建一个应用程序,其中每个客户都有自己的数据库。因此,作为登录信息,他们需要输入三个不同的字段:客户编号,用户名,密码。
用户名和密码应该执行常规的身份验证工作,并且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 %}
时,它都会转到默认数据库,并说用户是匿名的。
我不知道解决这个问题的正确方法是我的解决方案就是错吗?
答案 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中调用的会话变量中,那么此解决方案是否可以接受?或者存在某些风险吗?>