下面是 “Django-Rest-Framework 权限管理源码浅析(小结)”的完整攻略:
标题
简介
在 Restful API 开发过程中,权限管理是一个非常重要的问题。Django Rest Framework 提供了很多的权限组件,方便我们实现不同的权限管理。本文通过对 Django-Rest-Framework 权限管理源码的浅析,来讲解如何使用它完成自定义的权限管理。
权限组件的使用
Django Rest Framework已经为我们提供了以下的一些异常处理类:
APIException
: DRF框架下所有其他异常类的父类ValidationError
: 验证错误,即对数据的验证不正确PermissionDenied
: 权限拒绝NotFound
: 页面未找到MethodNotAllowed
: 访问资源没有使用正确的请求方式NotAuthenticated
: 用户未认证
其中 PermissionDenied, NotAuthenticated
两个异常类就是用来处理权限相关的问题,我们可以根据实际的业务需求自定义异常类。
权限组件的使用非常简单,只需要对视图进行配置即可:
from rest_framework import permissions
class MyView(APIView):
permission_classes = [permissions.AllowAny] # 所有人均可访问
还支持多种内置的权限类,例如 DjangoModelPermissions、DjangoObjectPermissions 等,用来管理模型或对象的权限。
权限源码浅析
在DRF中,权限相关源码位于 rest_framework.permissions 模块下。常用的权限类有:
- AllowAny
- IsAuthenticated
- IsAdminUser
- IsAuthenticatedOrReadOnly
- DjangoModelPermissions
- DjangoObjectPermissions
我们以 IsAuthenticated 权限类为例,简单介绍其源码:
class IsAuthenticated(BasePermission):
"""
Allows access only to authenticated users.
"""
def has_permission(self, request, view):
return bool(request.user and request.user.is_authenticated)
IsAuthenticated 注释已经帮我们解释了它的作用: 只允许已认证的用户访问。has_permission 是这个类中最重要的方法,它是基于定义的规则(这里是用户是否已通过身份验证)返回 True 或 False。如果这个方法返回 True,DRF 将允许用户进入视图,否则将引发 PermissionDenied 异常。
Permission 方法的简介
Permission 基类有以下方法:
has_permission()
:视图类级别的检查。has_object_permission()
:对象级别的检查。
其中 has_permission()
是用来检查整个视图能否被访问,如果这个方法返回 True,那么视图可以被访问;如果返回 False,将会抛出 PermissionDenied 异常。
has_object_permission
是用来检查对象级别的权限。当视图操作对象时,DRF 将会调用这个方法,检查是否允许进行这个操作。如果你在你的视图中使用了这个类,你需要定义 get_object()
方法,以确保对象被正确加载。如果 has_object_permission()
返回 False,DRF 将会抛出 PermissionDenied 异常。
示例说明
以下示例用于 Reddit 网站,当用户试图编辑或删除某个评论时,执行 object 检查:
from rest_framework import permissions
class IsOwner(permissions.BasePermission):
"""
来自对象已认证的请求只允许所有者访问。
"""
def has_object_permission(self, request, view, obj):
"""
确定请求的方法是否允许该对象的访问。
"""
# Permissions放行请求GET,HEAD或OPTIONS
if request.method in permissions.SAFE_METHODS:
return True
# 仅允许所有者进行写权限
return obj.owner == request.user
这里我们定义了一个名为 IsOwner 的权限类,它是继承了 BasePermission。DRF 知道在检查对象权限时它需要调用 has_object_permission()
方法,因为它在 IsOwner 中已经被定义。我们重写了 has_object_permission 方法来执行对象的检查,根据是否为 GET 请求来分别判断允许访问或者是只允许所有者访问。
另外一个示例是用于 Reddit 网站,当用户没有通过身份验证时执行判断:
from rest_framework.permissions import BasePermission, SAFE_METHODS
class IsNotAuthenticated(BasePermission):
"""
仅允许未经身份验证的用户访问
"""
def has_permission(self, request, view):
# 允许不验证的请求GET,HEAD或OPTIONS
if request.method in SAFE_METHODS:
return True
# 检查该请求是否是否验证过
return not request.user.is_authenticated
我们可以开始看看has_permission()
方法。它检查 HTTP 请求方法是否是安全的 (SAFE_METHODS
),如果是安全的方法(例如 GET)并且用户没有通过身份验证,则返回 True;
不是安全方法 (例如 POST、PUT 或 DELETE) 且用户不能通过身份验证,则返回 True。如果这个方法返回 False,DRF 将会抛出 PermissionDenied 异常。
小结
Django-Rest-Framework 权限管理源码浅析完整攻略已经结束。相信通过阅读本文,你已经对DRF的权限管理组件有了更深入的了解并可以自定义管理权限组件。同时,自定义的许可证组件应该由 BasePermission
类或其子类派生,该类包含 has_permission
和 has_object_permission
条件的方法。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django-Rest-Framework 权限管理源码浅析(小结) - Python技术站