2015-11-03 3 views
1

Это мое разрешение:DjangoRestFramework - has_permission неправильно перекрывая has_object_permission

class IsCreationOrAuthenticatedOrIsOwnerOrWatchOrReadOnly(permissions.BasePermission): 
    """ 
    Allow only the owner (and admin) of the object to make changes (i.e. 
    do PUT, PATCH, DELETE and POST requests. Allow all other users 
    ReadOnly or Follow options. This is for UserViewSet. Allow unauthenticated users to 
    create objects. 
    """ 

    def has_permission(self, request, view): 
     if not request.user.is_authenticated(): 
      if view.action == 'create': 
       return True 
      return False 

     return request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow' 

    def has_object_permission(self, request, view, obj): 

     if not request.user.is_authenticated(): 
      return False 

     if request.method in permissions.SAFE_METHODS: 
      return True 

     if request.user.is_staff: 
      return True 

     if view.action == 'follow': 
      return True 

     return obj.owner == request.user 

Проблема заключается в том, что прошедшие проверку подлинности пользователи не могут PUT, PATCH или удалить свой счет, потому что в has_permission он говорит:

return request.method in permissions.SAFE_METHODS or request.user.is_staff or view.action=='follow' 

Однако , PUT, PATCH и DELETE здесь зависит от того, obj.owner == request.user (это зависит от объекта). Итак, как я могу разрешить пользователям PUT, PATCH и DELETE только их учетную запись, когда has_permission не имеет доступа к объекту и поэтому не должен допускать никаких PUT, PATCH и DELETE (потому что все зависит от того, obj.owner == request.user.

+0

Почему вы не удалите чеки 'has_permission' и позволяют небезопасные методы? Они будут проверены в' has_object_permission' все равно –

+0

@RetoAebersold Поскольку создание объектов и получение списка объектов не обрабатывается 'has_object_permission', оно обрабатывается' has_permission'. nd Мне нужно убедиться, что пользователи, не прошедшие проверку подлинности, не могут получить список объектов, но имеют доступ к POST (создание объектов). – user2719875

ответ

2

Почему вы не блокируете has_permissions и изменять has_object_permission для проверки POST, а?

def has_object_permission(self, request, view, obj): 

    if request.method == 'POST': 
     return True 

    if not request.user.is_authenticated(): 
     return False 

    if request.method in permissions.SAFE_METHODS: 
     return True 

    if request.user.is_staff: 
     return True 

    if view.action == 'follow': 
     return True 

    return obj.owner == request.user 
Смежные вопросы