Как да предотвратите влизането на няколко потребителя в django (забележка: Когато първият потребител влезе, забранете влизането на втори потребител)

Разработвам Django приложение, използвайки django auth модул и бих искал да предотвратя многократно влизане с едно и също потребителско име и парола.

Това трябва да предотврати множество влизания на различни машини, използващи едно и също потребителско име и парола. Когато вторият потребител се опита да влезе в същия акаунт, вторият не трябва да получи достъп, освен ако първият излезе.


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)

След това създайте свой персонализиран метод за удостоверяване (създайте < strong>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