如何在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)
工作流程说明
- 在Django Admin中选中用户,点击"强制登出选中的用户",该用户的
is_token_revoked会被设为True; - 前端用户刷新页面时,会使用当前持有的access token请求后端接口;
- 后端自定义验证后端检查到用户的失效标记为
True,抛出InvalidToken异常,返回401状态码; - React前端原本的simplejwt拦截逻辑会捕获401状态,自动跳转到登录页面,完成登出;
- 验证后端会自动将用户的
is_token_revoked重置为False,避免用户重新登录后再次被拦截。
内容的提问来源于stack exchange,提问作者Ibrahim Khan
相关产品推荐
相关产品推荐

