我想基于view + method + user permissions在Django Rest Framework中创建权限。
有没有办法在不手动编写每个权限的情况下实现此目的,并检查用户所在群组的权限?
此外,我面临的另一个问题是权限对象与某个模型绑定。由于我有影响不同模型的视图,或者我想对方法PUT授予不同的权限,取决于我访问的视图(因为它影响不同的字段),我希望我的权限绑定到某个视图,而不是某种模式。
任何人都知道如何做到这一点?
我正在寻找一种解决方案:
1)使用以下参数创建Permissions对象:View_affected,list_of_allowed_methods(GET,POST等)
2)创建一个具有该权限关联的组对象
3)将用户添加到组
4)让我的默认权限类别处理所有事情。
从我现在的情况来看,给我带来问题的步骤是第1步。因为我看不到用视图绑定权限,并且因为权限要求模型,我不想要模型。
非常感谢任何帮助!
答案 0 :(得分:4)
嗯,使用DRF可以轻松完成第一步。请参阅http://www.django-rest-framework.org/api-guide/permissions#custom-permissions。
你必须做那样的事情:
from functools import partial
from rest_framework import permissions
class MyPermission(permissions.BasePermission):
def __init__(self, allowed_methods):
self.allowed_methods = allowed_methods
def has_permission(self, request, view):
return request.method in self.allowed_methods
class ExampleView(APIView):
permission_classes = (partial(MyPermission, ['GET', 'HEAD']),)
答案 1 :(得分:1)
可以通过这种方式创建自定义权限,有关更多信息,请参见官方文档(https://www.django-rest-framework.org/api-guide/permissions/):
from rest_framework.permissions import BasePermission
# Custom permission for users with "is_active" = True.
class IsActive(BasePermission):
"""
Allows access only to "is_active" users.
"""
def has_permission(self, request, view):
return request.user and request.user.is_active
# Usage
from rest_framework.views import APIView
from rest_framework.response import Response
from .permissions import IsActive # Path to our custom permission
class ExampleView(APIView):
permission_classes = (IsActive,)
def get(self, request, format=None):
content = {
'status': 'request was permitted'
}
return Response(content)
答案 2 :(得分:0)
谢谢,我接受了这个主意,并使它像这样工作:
class genericPermissionCheck(permissions.BasePermission):
def __init__(self, action, entity):
self.action = action
self.entity = entity
def has_permission(self, request, view):
print self.action
print self.entity
if request.user and request.user.role.access_rights.filter(action=self.action,entity=self.entity):
print 'permission granted'
return True
else:
return False
我在装饰器中将partial用于视图集类中的category动作,如下所示:
@list_route(methods=['get'],permission_classes=[partial(genericPermissionCheck,'Fetch','Categories')])
def Categories(self, request):
顺便说一句,“ access_rights”映射到具有一对动作和对象的对象数组,例如“编辑”和“博客”