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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yjjpp2301

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值