Django Rest框架-基于组添加视图权限?



TLDR:如何使用Django Rest框架允许特定组访问视图?


我正在用Django Rest框架构建一个web服务。只有视图的一个(适当的)子集打算对客户可用。

到目前为止,我已经:

  1. 设置默认权限为rest_framework.permissions.IsAdminUser
  2. 创建了一个名为is_customer的权限(使用Django管理网站)
  3. 创建了一个名为customers的组,并将所有相关用户添加到该组(使用管理员网站)
  4. customers添加了is_customer权限(再次使用管理网站)

我所有的视图都是基于函数的。为了给customers组提供适当的权限,我尝试了

from rest_framework.decorators import api_view
from django.contrib.auth.decorators import permission_required
@api_view(["POST"])
@permission_required(["is_customer"])
def my_func(request):
# calculations
return Response(...)

EDIT:也尝试了下面的方法

from rest_framework import permissions
from rest_framework.decorators import api_view
class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_customer:
return True
return False
def has_object_permission(self, request, view, obj):
if request.user.is_customer:
return True
return False
@api_view(["POST"])
@permission_required([IsCustomer])
def my_func(request):
# calculations
return Response(...)

from rest_framework.decorators permission_classes, api_view
@api_view(["POST"])
@permission_classes(["is_customer"])
def my_func(request):
# calculations
return Response(...)

似乎都不起作用。正确的做法是什么?提前感谢任何建议!

如果直接引用类,最后一个块应该可以工作:

from rest_framework.decorators permission_classes, api_view
@api_view(["POST"])
@permission_classes([IsCustomer])
def my_func(request):
# calculations
return Response(...)

你可以用一个类似的例子来查看文档:https://www.django-rest-framework.org/api-guide/permissions/

IsCustomer类未正确设置。这个类应该是这样的:

class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if 'auth.is_customer' in request.user.get_all_permissions():
return True
return False
def has_object_permission(self, request, view, obj):
if 'auth.is_customer' in request.user.get_all_permissions():
return True
return False

从那里,使用@permission_classes([IsCustomer])按预期工作。因此,视图的最终形式是:

@api_view(["POST"])
@permission_classes([IsCustomer])
def testing_post(request):
try:
someData = someCalculations()
return Response(data=someData, status=status.HTTP_200_OK)
except ValueError as e:
return Response(e.args[0], status.HTTP_400_BAD_REQUEST)

最新更新