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

如何在Django基于类的视图中使用REST JWT授权认证及权限控制

Django JWT认证下视图获取用户信息与权限控制指南

嘿,我来一步步帮你理清这些问题~ 你已经在全应用用了JWT认证,现在要在视图里落地,核心就是让DRF正确解析token并把用户信息绑定到request.user,再加上权限校验。

一、怎么启用request.user?它和中间件/认证类的关系

首先明确:Django原生的request.user默认靠AuthenticationMiddleware处理,但JWT认证是在DRF(Django REST Framework)层面实现的,所以关键是配置DRF的认证类,而非普通的Django中间件。

1. 全局配置(推荐)

在settings.py里给DRF指定JWT认证类,这样所有视图都会默认使用这个认证逻辑:

# settings.py
REST_FRAMEWORK = {
    # 配置JWT认证为默认认证方式(以simplejwt为例)
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],
    # 可选:默认要求用户已认证才能访问视图
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ]
}

如果你用的是其他JWT库(比如djangorestframework-jwt),把上面的路径换成对应库的认证类即可。

2. 局部视图配置

如果不想全局生效,也可以单独给某个视图指定认证类:

  • 函数视图:用装饰器声明
  • 类视图:直接在类里设置属性

配置完成后,当请求带着正确的Authorization: Bearer <你的token>头进来时,DRF会自动解析token,验证通过后把对应的用户实例赋值给request.user。

二、请求头没传token时,request.user是什么?

不是null(Python里的None),而是DRF的AnonymousUser对象。你可以通过request.user.is_authenticated来判断用户是否已完成认证:

if request.user.is_authenticated:
    # 用户已登录,处理业务逻辑
else:
    # 未登录,返回401或提示信息

三、实现“仅允许特定权限用户创建已审核场地”的代码示例

假设你用的是djangorestframework-simplejwt,下面给你两种视图的实现方式:

1. 函数视图版本

from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.response import Response

@api_view(['POST'])
# 全局配置过认证类的话,这行可以省略
@authentication_classes([JWTAuthentication])
# 先确保用户已登录
@permission_classes([IsAuthenticated])
def create_verified_venue(request):
    # 获取当前用户
    current_user = request.user
    
    # 检查用户是否有创建已审核场地的权限(替换成你实际的权限标识)
    if not current_user.has_perm('your_app.add_verifiedvenue'):
        return Response({'error': '你没有权限创建已审核场地'}, status=403)
    
    # 这里写你的场地创建逻辑
    # ...
    
    return Response({'message': '已审核场地创建成功'}, status=201)

2. 类视图版本

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.response import Response

class VerifiedVenueCreateView(APIView):
    # 局部配置认证类(全局配置过可省略)
    authentication_classes = [JWTAuthentication]
    # 要求用户已登录
    permission_classes = [IsAuthenticated]

    def post(self, request):
        current_user = request.user
        
        # 权限校验
        if not current_user.has_perm('your_app.add_verifiedvenue'):
            return Response({'error': '你没有权限创建已审核场地'}, status=403)
        
        # 场地创建逻辑
        # ...
        
        return Response({'message': '已审核场地创建成功'}, status=201)

3. 自定义权限类(更灵活)

如果你的权限逻辑比较复杂(比如判断用户是否属于某个组,或者用户有特定属性),可以写一个自定义权限类:

from rest_framework.permissions import BasePermission

class CanCreateVerifiedVenue(BasePermission):
    def has_permission(self, request, view):
        # 自定义逻辑:比如用户是管理员,或者属于"场地审核员"组
        return request.user.is_authenticated and request.user.groups.filter(name='场地审核员').exists()

然后在视图里替换掉原有的权限类:

# 函数视图
@permission_classes([CanCreateVerifiedVenue])

# 类视图
permission_classes = [CanCreateVerifiedVenue]

四、常见坑点提醒

  • 确保请求头格式正确:必须是Authorization: Bearer <token>,注意Bearer后面有个空格。
  • 如果request.user一直是AnonymousUser,先检查:
    1. DRF的认证类有没有配置正确
    2. 请求头是否正确携带了token
    3. token是否有效(没过期、签名正确)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:37:05