1

Ich bin ziemlich neu und Django Rest Framework und ich habe einige Fragen bezüglich Berechtigungen.Berechtigungen Überprüfung in Serializer, Django Rest Framework,

So habe ich einen Benutzer, der ein Mitglied der Organisation und Mitglied einer Gruppe ist. Können sagen, wir haben ein Modell:

class SomeModel: 
    organization = models.ForeignKey(Organization) 
    name = models.CharField() 

Benutzer kann nur create/updateSomeModel für seine eigene Organisation und wenn er eine Gruppe von „Koordinatoren“ ist er kann auch create/update für jede Organisation.

Derzeit ist mein Ansatz, diese Bedingungen in Serializer zu überprüfen, in .create() und .update() Methoden, da die Daten bereits validiert sind und ich PermissionDenied Fehler dort anhöre. Aber es fühlt sich so an, als wäre das nicht der "richtige Weg". Ich habe versucht, benutzerdefinierte Berechtigungsklassen zu erstellen, aber dann werden die Daten nicht überprüft, da Berechtigungsklassen vor den Serialisierern überprüft werden. Haben Sie Vorschläge, wie soll ich das angehen?

Sorry für schlecht Englisch, es ist nicht meine Muttersprache. Danke!

EDIT: Beispiel: anfordern Daten sind so etwas wie:

payload = {'organization': 1, 'name': 'Name'} 

Also, wenn ein Benutzer von Organisation 1 oder er ist ein Koordinator Zugang gewährt werden soll und SomeModel soll

+1

Warum möchten Sie bei Verwendung benutzerdefinierter Berechtigungsklassen weitere Daten validieren, wenn ein Benutzer keine Berechtigung zum Erstellen/Aktualisieren hat? –

+1

Ich muss überprüfen, ob die Organisation in dem Modell, das gerade erstellt wird, existiert. –

+0

Ich habe ein Beispiel hinzugefügt, das mir helfen könnte, mein Problem zu verstehen ... –

Antwort

4

erstellt werden Sie können eine benutzerdefinierte Berechtigungsklasse HasWritePermissions schreiben, die überprüft, ob ein Benutzer Schreib-/Updateberechtigungen hat.

Um einen custom permission class zu erstellen, müssen Sie die Klasse BasePermission überschreiben und die Methode has_permission() implementieren. Diese Methode sollte True zurückgeben, wenn Anfrage gewährt wird, andernfalls False.

class HasWritePermissions(BasePermission): 

    def has_permission(self, request, view): 
     # grant access to non-create/update requests 
     if request.method not in ['POST', 'PUT', 'PATCH']: 
      return True 

     # grant access if user is a member of organization of the object 
     # to be modified or is a coordinator 
     if (organization in user.organizations) or (user_is_a_coordinator): 
      return True 

     # Otherwise don't grant access 
     return False 
+1

Um die Organisation des Objekts zu überprüfen, müssen die Anforderungsdaten zuerst validiert werden? Oder wie bekomme ich ein Objekt, das gerade erstellt wird? –

+0

Ja, um sowohl das Erstellen/Aktualisieren mit dieser Methode zu behandeln, müssten Sie die Suche nach Organisationsobjekt mit seiner ID durchführen und überprüfen, dass es in den Organisationen des Benutzers ist. –

+0

Aber was passiert, wenn das Organisationsfeld nicht in der Anfrage vorhanden ist? Nutzlast oder Organisations-ID existiert nicht in der Datenbank. Das würde einige unerwünschte Status 500 Fehler verursachen ... Ich könnte all diese Dinge überprüfen, aber dafür sind Serialisierer und Validatoren? –

Verwandte Themen