2016-11-29 3 views
0

Ich habe ein paar StackOverflow-Threads gelesen, konnte aber keine zufriedenstellende oder funktionierende Lösung finden. Ich hätte gerne mehrere benutzerdefinierte Berechtigungen, die mehr oder weniger komplex sind (variierend von ReadOnly bis, Limit by-user ...).Django Rest Framework und Berechtigungen

Lasst uns beginnen mit dem, was ich jetzt haben:

  • eine Basisklasse, nur lesbar
  • meine Einstellungen
  • ein Viewset für die Nutzer.
  • und ein staff_user, der das alles zusammenbrechen lassen

Meine Basisklasse wie folgt aussieht:

class ReadOnly(permissions.BasePermission): 
    """ 
    Only, always, ever allow read-only access. 
    """ 

    def has_permission(self, request, view): 
     if request.method in permissions.SAFE_METHODS: 
      return True 

     return False 

und wird entsprechend innerhited durch die Viewset des Beispiels Benutzers

class UserViewSet(viewsets.ModelViewSet): 
    """ 
    Retrieve the user associated with your session and allow all methods. 
    """ 
    serializer_class = UserSerializer 
    permission_classes = (ReadOnly,) 

    def get_queryset(self): 
     return User.objects.filter(id=self.request.user.id) # This should return an empty queryset when not logged in 

und der entsprechenden Herbst -back default permission ist

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': [ 
     'api.permissions.ReadOnly' 
    ] 
} 

Wenn ich jetzt auf die Benutzerseite zugreife und mich als Mitarbeiter einlogge, kann ich einfach Benutzer per POST erstellen und das gilt auch für alle meine anderen Ansichten. was geschieht hier?

+0

Der Code, den Sie hier eingefügt haben * funktioniert * richtig. – Linovia

Antwort

0

Ich habe ein bisschen weiter auf dem Thema gut .. So, hier ist mein Code für eine komplexere Erlaubnis:

class IsCurrentUserOrDeny(permissions.BasePermission): 
""" 
Allow the current user to edit his own user object 
""" 

def has_object_permission(self, request, view, obj): 
    return False 
    if request.method in permissions.SAFE_METHODS: 
     return obj == request.user 

    return False 

def has_permission(self, request, view): 
    return True 

Offenbar die ModelViewSet mit der has_object_permissions Methode nicht auf. Wenn Sie has_permissions auf "False" setzen, werden alle Anfragen abgelehnt (wie erwartet). Die Dokumentation sagt

Hinweis: Die instance-level has_object_permission-Methode wird nur aufgerufen, wenn die View-Level has_permission-Prüfungen bereits bestanden haben. Beachten Sie außerdem, dass der Ansichtscode explizit für die Ausführung der Prüfungen auf Instanzebene aufgerufen werden sollte. Check_object_permissions (request, obj). Wenn Sie die generischen Ansichten verwenden, wird dies standardmäßig für Sie erledigt.

Da ModelViewSet eine zusammengesetzte Klasse, die von GenericViewApi inerhits, würde das erwartete Verhalten sein:

  • prüfen, ob has_permissions gibt True zurück
  • => Überprüfen Sie, ob has_object_permissions gibt True zurück

Aber das ist nicht wirklich der Fall. Was ist hier falsch?

Verwandte Themen