📅  最后修改于: 2023-12-03 15:23:06.674000             🧑  作者: Mango
在 Django REST Framework 中,权限是管理 API 访问权限的一种方式。通过对 API 进行身份验证和授权,在保护敏感数据的同时防止未经授权的访问。本文将介绍如何在 Django REST Framework 中添加不同类型的权限。
在 Django REST Framework 中添加权限很简单,只需要在视图(View)中添加 permission_classes
属性即可。如下所示:
from rest_framework.permissions import IsAuthenticated
class MyViewset(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]
# ...
在这个视图中,只有通过身份验证的用户才能访问该 API。如果未通过身份验证,则会得到一个 401 未授权的响应。
Django REST Framework 提供了一些常用的权限类,可以轻松实现访问控制。下面是一些常用的权限类:
AllowAny
:允许任何人访问该 API。IsAuthenticated
:只允许已经通过身份验证的用户访问该 API。IsAdminUser
:只允许管理员用户访问该 API。IsAuthenticatedOrReadOnly
:对于未经身份验证的用户,只允许读取 API 内容,但不能执行写入操作。DjangoModelPermissions
:基于 Django 模型的权限控制。控制程序对 Django 模型的增删改查操作。DjangoObjectPermissions
:基于 Django 模型的单个实例权限控制。控制程序对 Django 模型中单个实例的增删改查操作。使用这些权限类非常简单,只需要把它们以列表的形式赋值给视图的 permission_classes
属性即可。例如,如果想要控制某个 API 只对管理员用户开放,则代码如下所示:
from rest_framework.permissions import IsAdminUser
class MyViewset(viewsets.ModelViewSet):
permission_classes = [IsAdminUser]
# ...
如果需要更复杂的访问控制,可以创建自定义的权限类。自定义权限类需要实现一个 BasePermission
类的子类,并定义其中的 has_permission
和 has_object_permission
方法。
from rest_framework.permissions import BasePermission
class MyCustomPermission(BasePermission):
message = 'Custom message when permission is denied'
def has_permission(self, request, view):
"""
Define if the user has permission to access the API
"""
# Add your logic here - for example:
# return request.user.is_authenticated()
return True
def has_object_permission(self, request, view, obj):
"""
Define if the user has permission to access a specific object
"""
# Add your logic here - for example:
# return obj.author == request.user
return True
有了自定义权限类后,可以像使用其他权限类一样将其添加到视图中。例如:
class MyViewset(viewsets.ModelViewSet):
permission_classes = [MyCustomPermission]
# ...
通过使用权限,可以轻松地控制 Django REST Framework 中的 API 访问。想要控制访问谁和什么时候能访问,只需要将相应的权限类添加到视图即可。同时,自定义权限类可以应对复杂的授权场景。