AberSheeran
Aber Sheeran

Django 禁止用户多客户端登录

起笔自
所属文集: 程序杂记
共计 957 个字符
落笔于

本文全部基于 Django 默认的用户模型和会话(session)引擎。

在某些特殊项目里,会有一种需求——限制用户同时仅能在同一台设备登录,或者说同时仅能在同一个客户端内保持登陆状态。就像 QQ 一样,在一个手机客户端里登录后,另一个手机客户端中的账号就自动退出。

在 Django 里,每次登陆时,都会签发一个新的 Session,并将其存在数据库。其数据字段如下,其中 session_key 唯一,session_data 会存储用户信息,同一个用户拥有的 Sessionsession_data 值会一致。

session_key = models.CharField(_('session key'), max_length=40, primary_key=True)
session_data = models.TextField(_('session data'))
expire_date = models.DateTimeField(_('expire date'), db_index=True)

使用信号机制,一个新的 Session 被创建后,与其拥有相同 session_data 的其他 Session 数据都需要被删除。其代码如下:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.db.models import Q
from django.contrib.sessions.models import Session


@receiver(post_save, sender=Session)
def concurrent_logins(sender, instance: Session, **kwargs):
    Session.objects.filter(session_data=instance.session_data) \
        .filter(~Q(session_key=instance.session_key)).delete()
如果你觉得本文值得,不妨赏杯茶
Django 数据库自动重连
四行代码实现 Python 管道