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