Как предотвратить вход в систему нескольких пользователей в django (примечание: когда первый пользователь входит в систему, запрещает второму пользователю входить в систему)

Я разрабатываю приложение Django с использованием модуля аутентификации django и хотел бы предотвратить множественный вход в систему с использованием одного и того же имени пользователя и пароля.

Это должно предотвратить множественные входы в систему на разных машинах с использованием одного и того же имени пользователя и пароля. Когда второй пользователь пытается войти в ту же учетную запись, второй не должен получить доступ, если только первый не выйдет из системы.


person manish    schedule 03.02.2020    source источник
comment
Надеюсь, это поможет вам: stackoverflow .com/questions/50833980/   -  person Eyal.D    schedule 03.02.2020
comment
@Eyal.D Я хочу, чтобы второй не получил доступ, пока первый не выйдет из системы.   -  person manish    schedule 03.02.2020


Ответы (1)


Возможно, вы можете сделать что-то вроде этого (на основе этого answer):

Во-первых, создайте модель для связи между сеансом и пользователем:

from django.conf import settings
from django.db import models
from django.contrib.sessions.models import Session

class UserSession(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    session = models.OneToOneField(Session, on_delete=models.CASCADE)

Затем создайте собственный метод аутентификации (создайте < сильный>custom backend):

from django.contrib.auth.backends import ModelBackend

class MyBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
         if Session.objects.filter(usersession__user__username=username).exists():
             return None
         else:
             user = super().authenticate(request, username=username, password=password, **kwargs)
             if user:
                  request.session.save()
                  UserSession.objects.get_or_create(
                       user=user,
                       session=Session.objects.get(pk=request.session.session_key)
                  )
             return user

Затем используйте этот бэкэнд в settings.py:

AUTHENTICATION_BACKENDS = ['path.to.MyBackend']
person ruddra    schedule 03.02.2020
comment
Я получил ошибку на session=Session.objects.get(pk=request.session.session_key) в чем может быть проблема - person manish; 06.02.2020
comment
Я попробовал и получил ошибку, например, запрос для этого сеанса не существует. У меня есть get_or_create, если сеанс не существует. Почему я все еще получаю эту ошибку? - person manish; 06.02.2020
comment
ты бежал request.session.save()? - person ruddra; 06.02.2020