2017-02-22 3 views
2

Objektberechtigungen

Beispiel von http://www.django-rest-framework.org/tutorial/4-authentication-and-permissions/#object-level-permissionsDjango: Objektberechtigungen DRY

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 

Mein Bedürfnis: Queryset aller Objekte ein Benutzer bearbeiten können

ich ein django-orm queryset haben wollen enthält alle Objekte, die ein bestimmter Benutzer bearbeiten kann.

Ich glaube, ich könnte dieses Problem lösen, indem ein Komplex django-orm Filter zu schaffen (mit OR und verschieden)

nicht trocken

Aber das ist nicht trocken. Das ist nicht DRY, weil ich das Zeug zweimal codieren muss. Einmal in has_object_permission() und einmal im Django-Orm-Filter.

Frage

Wie mein Bedürfnis (queryset aller Objekte ein Benutzer bearbeiten kann) lösen, ohne Duplizierung die Erlaubnis überprüfen?

Antwort

2

Wenn Sie möchten, dass die Dinge DRY bleiben, müssen Sie die gesamten Datenbankeinträge laden und die Berechtigungsprüfung auf alle anwenden.

Ich bezweifle, dass Sie das wirklich wollen. Irgendwann kann man die Sachen nicht trocken halten.

Dasselbe gilt für die Anzeige von Daten für einen Benutzer. Normalerweise wenden Sie beim Ausführen der Abfrage implizit grundlegende Berechtigungen an und stellen dann sicher, dass die vollständigen Berechtigungen gültig sind oder nicht.

+0

Obwohl dies nicht die Antwort ist, nach der ich gesucht habe: Danke, dass Sie darüber nachgedacht haben. – guettli

+1

Ja, das stört mich auch und das ist nicht passend für Django REST Framework. Ich freue mich darauf zu sehen, ob jemand eine andere Option hat. – Linovia