You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中强制前端用户登出?

实现Django端强制登出用户(基于djangorestframework-simplejwt)

因为djangorestframework-simplejwt默认是无状态令牌机制,要实现强制登出,我们可以通过给用户添加"令牌失效标记",并在令牌验证阶段检查该标记来完成,完全不需要修改React前端代码。

步骤1:扩展用户模型添加失效标记

首先给用户模型新增一个字段,用来标记是否需要强制登出该用户:

# your_app/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class CustomUser(AbstractUser):
    is_token_revoked = models.BooleanField(default=False, verbose_name="是否强制登出")

然后在项目settings.py中配置自定义用户模型:

# settings.py
AUTH_USER_MODEL = "your_app.CustomUser"

步骤2:自定义令牌验证后端

重写simplejwt的令牌验证逻辑,在解码令牌时检查用户的失效标记,如果标记为True则拒绝验证,触发前端登出:

# your_app/authentication.py
from rest_framework_simplejwt.backends import TokenBackend
from rest_framework_simplejwt.exceptions import InvalidToken
from django.contrib.auth import get_user_model

User = get_user_model()

class RevokeTokenBackend(TokenBackend):
    def decode(self, token, verify=True):
        # 先执行默认的解码逻辑
        payload = super().decode(token, verify)
        
        # 获取用户ID并检查状态
        user_id = payload.get("user_id")
        try:
            user = User.objects.get(id=user_id)
            if user.is_token_revoked:
                # 重置标记,避免用户重新登录后仍被拦截
                user.is_token_revoked = False
                user.save()
                raise InvalidToken("令牌已被撤销,请重新登录")
        except User.DoesNotExist:
            raise InvalidToken("用户不存在")
        
        return payload

接着在settings.py中替换simplejwt的默认验证后端:

# settings.py
SIMPLE_JWT = {
    "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    "TOKEN_BACKEND": "your_app.authentication.RevokeTokenBackend",
}

步骤3:在Django Admin添加强制登出操作

给用户管理页面添加批量或单个的强制登出按钮:

# your_app/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    # 添加自定义动作
    actions = ["force_logout_selected_users"]
    
    # 自定义强制登出逻辑
    def force_logout_selected_users(self, request, queryset):
        # 将选中用户的失效标记设为True
        queryset.update(is_token_revoked=True)
        self.message_user(request, "已成功标记选中用户为强制登出状态")
    
    # 设置动作显示名称
    force_logout_selected_users.short_description = "强制登出选中的用户"

# 注册自定义用户模型和Admin类
admin.site.register(CustomUser, CustomUserAdmin)

工作流程说明

  1. 在Django Admin中选中用户,点击"强制登出选中的用户",该用户的is_token_revoked会被设为True;
  2. 前端用户刷新页面时,会使用当前持有的access token请求后端接口;
  3. 后端自定义验证后端检查到用户的失效标记为True,抛出InvalidToken异常,返回401状态码;
  4. React前端原本的simplejwt拦截逻辑会捕获401状态,自动跳转到登录页面,完成登出;
  5. 验证后端会自动将用户的is_token_revoked重置为False,避免用户重新登录后再次被拦截。

内容的提问来源于stack exchange,提问作者Ibrahim Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 15:25:19