2015-11-03 4 views
1

PRÉPONDÉRANTS Ceci est ma permission:DjangoRestFramework - has_permission mal 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 

Le problème est que les utilisateurs authentifiés ne peuvent pas PUT, PATCH ou SUPPRIMER leur propre compte parce que dans has_permission il dit:

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

Cependant , PUT, PATCH et DELETE ici dépend de si obj.owner == request.user (cela dépend de l'objet). Alors, comment puis-je permettre aux utilisateurs de PUT PATCH et supprimer uniquement leur compte lorsque has_permission n'a pas accès à l'objet et ne devrait donc pas permettre à tout PUT, PATCH et SUPPRIMER (car tout dépend si oui ou non le obj.owner == request.user.

+0

Pourquoi ne pas supprimer les contrôles de 'has_permission' et permettent les méthodes dangereuses? Ils seront contrôlés dans' has_object_permission' de toute façon –

+0

@RetoAebersold Parce que créer des objets et obtenir une liste d'objets n'est pas géré par 'has_object_permission', il est géré par' has_permission'. Je dois m'assurer que les utilisateurs non authentifiés ne peuvent pas obtenir une liste d'objets mais ont accès au POST (création d'objets). – user2719875

Répondre

2

Pourquoi ne pas désactiver has_permissions et modifier has_object_permission pour vérifier POST ainsi?

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