2016-11-29 128 views
0

我已经通过几个StackOverflow线程读过,但无法达到任何满意的工作解决方案。 我想有几个自定义权限,或多或少复杂(从ReadOnly到,限制用户...)。Django Rest框架和权限

让我们先用我现在所拥有的:

  • 一个基类,只读
  • 我的设置
  • 为用户视图集。
  • 和staff_user,谁,让我们崩溃的一切

我的基类的样子:

class ReadOnly(permissions.BasePermission): 
    """ 
    Only, always, ever allow read-only access. 
    """ 

    def has_permission(self, request, view): 
     if request.method in permissions.SAFE_METHODS: 
      return True 

     return False 

,并相应地由例如用户的视图集中

class UserViewSet(viewsets.ModelViewSet): 
    """ 
    Retrieve the user associated with your session and allow all methods. 
    """ 
    serializer_class = UserSerializer 
    permission_classes = (ReadOnly,) 

    def get_queryset(self): 
     return User.objects.filter(id=self.request.user.id) # This should return an empty queryset when not logged in 

及相应的秋天innerhited - 默认权限为

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'api.permissions.ReadOnly' 
    ] 
} 

当我现在访问用户页面并以员工身份登录时,我可以通过POST轻松创建用户,同样适用于所有其他视图集。这里发生了什么?

+0

您粘贴的代码*确实可以正常工作。 – Linovia

回答

0

我有肠道远一点的问题.. 所以,这里是我的一个更复杂的权限代码:

class IsCurrentUserOrDeny(permissions.BasePermission): 
""" 
Allow the current user to edit his own user object 
""" 

def has_object_permission(self, request, view, obj): 
    return False 
    if request.method in permissions.SAFE_METHODS: 
     return obj == request.user 

    return False 

def has_permission(self, request, view): 
    return True 

显然,使用ModelViewSet将无法查找has_object_permissions方法。将has_permissions更改为False会拒绝所有请求(如预期的那样)。文档告诉

注意:只有在视图级别has_permission检查已通过时才会调用实例级别的has_object_permission方法。还要注意,为了运行实例级检查,视图代码应该显式调用.check_object_permissions(request,obj)。如果您使用的是通用视图,那么默认情况下会为您处理。

由于ModelViewSet是从GenericViewApi inerhits一个构成的一类,预期的行为将是:

  • 请检查是否has_permissions返回True
  • =>请检查是否has_object_permissions返回True

但事实并非如此。这里有什么问题?