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