如何在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,先检查:- DRF的认证类有没有配置正确
- 请求头是否正确携带了token
- token是否有效(没过期、签名正确)
内容的提问来源于stack exchange,提问作者user9487981
相关产品推荐
相关产品推荐

