Django REST framework (DRF) 的权限认证涉及以下几个方面:全局权限配置、局部权限配置、自定义权限类、以及自定义认证类。以下是关于这些方面的详细说明:
1. 全局权限配置
在 Django 项目的配置文件 settings.py 中,可以全局配置 DRF 的权限管理类。这种设置适用于整个项目中的所有视图。默认情况下,如果不做任何配置,DRF 会允许所有用户访问视图(AllowAny)。
# settings.py
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',  # 仅允许已通过身份认证的用户访问
    )
}在此配置下,所有视图都会默认要求用户通过身份认证,否则无法访问。
2. 局部权限配置
局部权限配置可以覆盖全局设置,适用于单独的视图或视图集。通过为视图类指定 permission_classes 属性,可以定义该视图的权限控制。
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
    permission_classes = [IsAuthenticated]  # 仅允许已认证用户访问该视图
    ...局部配置让你可以在不同视图中应用不同的权限策略,提供了更灵活的控制。
3. 自定义权限类
有时内置的权限类不能满足所有需求,此时可以通过继承 rest_framework.permissions.BasePermission 类来创建自定义权限类。在这个类中,需要实现以下两个方法之一或全部:
- .has_permission(self, request, view):判断用户是否有权访问视图。
- .has_object_permission(self, request, view, obj):判断用户是否有权对特定模型对象执行操作。
例如,定义一个只允许角色为“xiaoming”的用户访问视图的权限类:
from rest_framework.permissions import BasePermission
class IsXiaoMingPermission(BasePermission):
    """
    仅允许角色为 'xiaoming' 的用户访问的自定义权限类
    """
    def has_permission(self, request, view):
        role = request.query_params.get("role")
        return role == "xiaoming"
    def has_object_permission(self, request, view, obj):
        # 这里可以加入对模型对象的权限控制逻辑
        return True在视图中使用这个自定义权限类:
from .permissions import IsXiaoMingPermission
from rest_framework.viewsets import ModelViewSet
from student.models import Student
from student.serializers import StudentSerializer
class StudentViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    permission_classes = [IsXiaoMingPermission]  # 应用自定义权限类4. 自定义认证类
自定义认证类用于扩展或替代 DRF 提供的默认认证机制(如 Session 认证、Basic 认证等)。自定义认证类需要继承 rest_framework.authentication.BaseAuthentication 并实现 authenticate(self, request) 方法。
from rest_framework.authentication import BaseAuthentication
from django.contrib.auth.models import User
class CustomAuthentication(BaseAuthentication):
    """
    自定义认证类,根据请求参数中的角色进行认证
    """
    def authenticate(self, request):
        role = request.query_params.get("role")
        if role == "root":
            user = User.objects.get(pk=1)  # 假设用户 ID 为 1 的是超级管理员
            return (user, None)
        return None在视图中使用自定义认证类:
from .authentications import CustomAuthentication
from rest_framework.viewsets import ModelViewSet
from student.models import Student
from student.serializers import StudentSerializer
class Student1ModelViewSet(ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    authentication_classes = [CustomAuthentication]  # 使用自定义认证类
    permission_classes = [IsAuthenticated]  # 使用内置权限类5. 总结
通过全局配置、局部配置、自定义权限类和自定义认证类,可以实现复杂的权限和认证逻辑,满足项目中不同的安全需求。这种灵活性使得 Django REST framework 成为处理复杂 API 需求的强大工具。












![草莓成熟度检测检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]](https://i-blog.csdnimg.cn/direct/6a5693b8d2104029863455b0d63c7a96.png#pic_center)







