Аутентификация Django с несколькими базами данных - PullRequest
0 голосов
/ 21 ноября 2018

Я хочу создать приложение для клиентов, где у каждого клиента есть своя БД.Таким образом, в качестве данных для входа в систему им необходимо ввести три различных поля: номер клиента, имя пользователя, пароль.

Имя пользователя и пароль должны выполнять обычные функции аутентификации, а номер клиента находится там, чтобы перейти к нужной таблице пользователей базы данных для аутентификации.можно перейти к другим базам данных с помощью функции 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 голосов
/ 21 ноября 2018

хорошо, попробовав кое-что, я нашел решение, которое, как мне кажется, работает для первого шага, но я не знаю, есть ли проблемы с безопасностью или какие-либо другие ошибки, если я использую его следующим образом

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, тогда это решение приемлемо или есть некоторые риски?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...