2017-02-22 1 views
2

autorisations de niveau d'objet

Exemple de http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#object-level-permissionsDjango: autorisations de niveau objet SECS

class IsOwnerOrReadOnly(permissions.BasePermission): 
    """ 
    Custom permission to only allow owners of an object to edit it. 
    """ 

    def has_object_permission(self, request, view, obj): 
     # Read permissions are allowed to any request, 
     # so we'll always allow GET, HEAD or OPTIONS requests. 
     if request.method in permissions.SAFE_METHODS: 
      return True 

     # Write permissions are only allowed to the owner of the snippet. 
     return obj.owner == request.user 

Mon besoin: queryset de tous les objets d'un utilisateur peut modifier

Je veux avoir un django-ORM queryset qui contient tous les objets qu'un utilisateur donné peut éditer.

Je suppose que je pourrais résoudre ce problème en créant un filtre django-ORM complexe (avec ou et distinct)

Non SEC

Mais ce n'est pas DRY. Ce n'est pas SEC parce que j'ai besoin de coder les choses deux fois. Une fois en has_object_permission() et une fois dans le filtre django-orm.

Question

Comment résoudre mes besoins (queryset de tous les objets d'un utilisateur peut modifier) ​​sans duplication de la vérification des permissions?

Répondre

2

Si vous voulez que les choses soient difficiles à garder au sec, vous devrez charger toutes les entrées de la base de données et appliquer la vérification des permissions à tout le monde.

Je doute que ce soit ce que vous voulez vraiment. Parfois, vous ne pouvez pas garder les choses au sec.

Il en va de même lorsque vous affichez des données à un utilisateur. Vous appliquerez généralement les autorisations de base implicitement lors de l'exécution de la requête, puis vous vous assurez que les autorisations complètes sont valides ou non.

+0

Bien que ce ne soit pas la réponse que je cherchais: Merci d'avoir pensé à cela. – guettli

+1

Ouais, c'est quelque chose qui me dérange aussi et qui ne convient pas au framework Django REST. Je suis impatient de voir si quelqu'un a une autre option. – Linovia