Как запретить многопользовательский вход в систему django (примечание: когда первый пользователь входит в систему, запретить второму пользователю вход в систему) - PullRequest
0 голосов
/ 03 февраля 2020

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

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

1 Ответ

2 голосов
/ 03 февраля 2020

Может быть, вы можете сделать что-то вроде этого (основываясь на этом 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']
...