Django REST框架下用户关闭浏览器的token处理及已登录跳转实现
问题1:用户未点击登出直接关闭浏览器时的Token处理方案
DRF默认内置的Token是永久有效的,即使用户关闭浏览器,Token依然会存储在后端数据库中,存在泄露后被滥用的风险,标准处理方案如下:
- 优先改用短时效Access Token + 长时效Refresh Token的机制,可使用djangorestframework-simplejwt库实现,默认Access Token有效期仅数分钟,即使用户未主动登出,短时间内Token就会自动失效,大幅降低安全风险
- 如果需要继续使用DRF内置Token,可给Token表新增
expire_time过期时间字段,每次用户发起请求时校验Token有效期,超过有效期直接删除Token要求用户重新登录;同时可配置定时任务定期清理数据库中已过期的无效Token - 前端存储Token时优先选择会话存储(sessionStorage),不要使用localStorage或未设置过期时间的Cookie,会话存储会在浏览器关闭时自动清空,就算后端还保留有效Token,前端也无法读取使用,降低泄露风险
- 核心敏感操作(比如修改密码、支付、删除数据等)额外增加二次验证逻辑,即使Token被盗用也无法直接执行高风险操作
问题2:已登录用户访问登录页自动跳转仪表盘的实现方案
需要分别改造你现有的模板视图和登录接口,代码修改如下:
模板视图修改
给LoginTemplateClass新增dispatch请求前置判断逻辑,校验用户是否已登录:
from django.shortcuts import redirect class LoginTemplateClass(TemplateView): template_name = 'index.html' def dispatch(self, request, *args, **kwargs): # 已登录用户直接跳转到仪表盘,此处dashboard替换为你实际的仪表盘路由名 if request.user.is_authenticated: return redirect('dashboard') return super().dispatch(request, *args, **kwargs)
登录接口优化
也可给登录接口新增已登录判断,避免已登录用户重复发起登录请求:
class LoginAPI(viewsets.ModelViewSet): serializer_class = LoginSerializer def post(self,request): # 已登录用户直接返回当前用户的有效Token if request.user.is_authenticated: token, created = Token.objects.get_or_create(user=request.user) return Response(token.key,status = 200) try: serializer = self.serializer_class(data=request.data,context={'request': request}) if serializer.is_valid(): user = serializer.validated_data['user'] token, created = Token.objects.get_or_create(user=user) return Response(token.key,status = 200) return Response(serializer.errors,status = 400) except Exception as e: return Response({},status = 500)
如果是前后端完全分离的架构,可额外在前端路由守卫中增加判断,本地存在有效Token时直接拦截登录页访问、跳转到仪表盘即可。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

