欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > Django REST Framework(十九)权限

Django REST Framework(十九)权限

2025/5/7 0:49:18 来源:https://blog.csdn.net/yjjpp2301/article/details/141585920  浏览:    关键词:Django REST Framework(十九)权限

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 APIViewclass 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 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

在视图中使用这个自定义权限类:

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) 方法。

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

在视图中使用自定义认证类:

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 需求的强大工具。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词