2017-03-28 125 views
1

我对Django-rest-framework中的BasePermission感到困惑。DRF中的has_object_permission和has_permission之间有什么区别:权限?

这里我定义了一个类:IsAuthenticatedAndOwner

class IsAuthenticatedAndOwner(BasePermission): 
    message = 'You must be the owner of this object.' 
    def has_permission(self, request, view): 
     print('called') 
     return False 
    def has_object_permission(self, request, view, obj): 
     # return obj.user == request.user 
     return False 

views.py

class StudentUpdateAPIView(RetrieveUpdateAPIView): 
    serializer_class = StudentCreateUpdateSerializer 
    queryset = Student.objects.all() 
    lookup_field = 'pk' 
    permissions_classes = [IsAuthenticatedAndOwner] 

使用不过,这并不在all.Everyone工作可以通过许可和更新数据。 called未打印。


,我用定义这个类:IsNotAuthenticated

class IsNotAuthenticated(BasePermission): 
    message = 'You are already logged in.' 
    def has_permission(self, request, view): 
     return not request.user.is_authenticated() 

它运作良好,在功能

class UserCreateAPIView(CreateAPIView): 
    serializer_class = UserCreateSerializer 
    queryset = User.objects.all() 
    permission_classes = [IsNotAuthenticated] 

那么,什么是上面的例子之间的差异,以及功能has_object_permission & has_permission

回答

5

基本上,第一个代码拒绝一切,因为has_permission返回False。

has_permission是在致电has_object_permission之前进行的检查。这意味着在您有机会检查所有权测试之前,您需要需要才能被has_permission所允许。

你想要的是:

class IsAuthenticatedAndOwner(BasePermission): 
    message = 'You must be the owner of this object.' 
    def has_permission(self, request, view): 
     return request.user.is_authenticated() 
    def has_object_permission(self, request, view, obj): 
     return obj.user == request.user 

这也将让通过验证的用户创建新的项目或列出。

+0

感谢您的回答。也许我的问题不清楚。首先,我的代码与您的代码一样。但它没有工作,每个人都可以通过权限。然后我通过'return False'更新函数。它仍然通过每个人。 –

0

permission_classespermissions_classes

我笨。

相关问题