Как сделать пользователя django неактивным и сделать все его сессии недействительными - PullRequest
2 голосов
/ 06 января 2020

Чтобы сделать пользователя неактивным, я обычно делаю:

User.objects.get(pk=X).update(is_active=False)

Однако, это не приводит к выходу пользователя из системы или выполнению каких-либо действий, связанных с сеансом. Есть ли в django встроенная функция, позволяющая сделать пользователя незамедлительно неактивным, или как лучше всего это сделать sh this?

Один из подобных ответов таков: { ссылка }, но это не очень хорошо работает, если миллионы сеансов (это грубый метод, повторяющийся во всех сеансах). Хотя это с 2009 года, надеюсь, сегодня есть лучший способ.

1 Ответ

1 голос
/ 09 января 2020

Как уже упоминалось, вы можете использовать django -user-session или django -qsessions . Но они включают в себя некоторые другие метаданные, такие как пользовательский агент и IP-адрес, и вы можете не захотеть их по какой-то причине. Затем вам нужно написать свой пользовательский бэкэнд сессии

Я немного подкорректировал пример и создал его в соответствии со своими потребностями.

session_backend.py:

from django.contrib.auth import get_user_model
from django.contrib.sessions.backends.db import SessionStore as DBStore
from django.contrib.sessions.base_session import AbstractBaseSession
from django.db import models

User = get_user_model()


class QuickSession(AbstractBaseSession):
    # Custom session model which stores user foreignkey to asssociate sessions with particular users.
    user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)

    @classmethod
    def get_session_store_class(cls):
        return SessionStore


class SessionStore(DBStore):
    @classmethod
    def get_model_class(cls):
        return QuickSession

    def create_model_instance(self, data):
        obj = super().create_model_instance(data)

        try:
            user_id = int(data.get('_auth_user_id'))
            user = User.objects.get(pk=user_id)
        except (ValueError, TypeError, User.DoesNotExist):
            user = None
        obj.user = user
        return obj

и в settings.py:

SESSION_ENGINE = 'path.to.session_backend'

Чтобы удалить весь сеанс для пользователя:

from session_backend import QuickSession
QuickSession.objects.filter(user=request.user).delete()

Вы можете написать свой собственный метод сохранения для пользовательской модели, чтобы автоматически удалять все сеансы для пользователя, если для поля is_active установлено значение False.

Имейте в виду, что поле пользователя для тех, кто не вошел в систему, будет иметь значение NULL.

...