2016-07-05 11 views
0

Ich habe eine CRUD in Django Rest Framework und um die Berechtigungen zu steuern Ich benutze Berechtigungsklassen. Hier ist die Berechtigungsklasse, die ich für CRUD erstellt habe. Das funktioniert gut für aktualisieren und löschen:Django Rest Framework - Berechtigung zum Erstellen

class LinkAssetPermission(permissions.BasePermission): 
    message = 'Link access not allowed.' 

    def has_object_permission(self, request, view, obj): 
     return obj.content.delivery.owner == request.user and obj.content.delivery.can_change 

Mein Problem, wenn, dass diese Klasse funktioniert nicht gut für meine erstellen Ansicht:

class AssetCreate(generics.CreateAPIView): 
    """ 
    Link a new asset 
    """ 
    queryset = Asset.objects.none() 
    serializer_class = AssetSerializer 
    permission_classes = (permissions.DjangoModelPermissions, LinkAssetPermission,) 

Wenn obj.content.delivery.can_change false zurück kann ich nicht erstellen, aktualisieren oder Modellobjekte löschen . Das Gleiche gilt für obj.content.delivery.owner == request.user. Ich kann nur erstellen, aktualisieren oder löschen, wenn der Benutzer der Besitzer ist. All das funktioniert so, wie ich es für das Update und das Löschen benötige, nur um zu erstellen, dass es nicht funktioniert. Wahrscheinlich, weil ich das Objekt noch nicht habe, das ist der Kern meiner Frage.

Das Objekt existiert beim Erstellen und ich habe auch versucht, nur return False um has_object_permission und ich kann immer noch den Datensatz erstellen.

Sollte ich eine neue Berechtigungsklasse für die Einfügung erstellen oder sollte ich etwas in meiner Sicht ändern?

Danke für jede Hilfe

+0

Ich meine, diese Methode obj.content.delivery.can_change false zurück, und ich kann einen neuen Datensatz erstellen. Meine Idee ist, wenn diese can_chance falsch zurückgibt, keine Datensätze erstellt, aktualisiert oder gelöscht werden können –

+0

Zum Zeitpunkt der Erstellung gibt es kein 'obj' vor dem Fortfahren mit' create'. Auf welches "obj" beziehen Sie sich? –

+0

Eigentlich gibt es, ich habe debugged. Ich habe auch versucht, nur die has_object_permission falsch zurückzugeben und ich kann immer noch den Datensatz erstellen –

Antwort

1

Ich fand heraus, was ich tun musste. Hier ist meine neue Berechtigungsklasse:

class LinkAssetPermission(permissions.BasePermission): 
    message = 'Link access not allowed.' 

    def has_permission(self, request, view): 
     try: 
      content = Content.objects.get(pk=request.parser_context["kwargs"]["content_id"]) 
     except: 
      return False 

     return content.delivery.owner == request.user and content.delivery.can_change 

    def has_object_permission(self, request, view, obj): 
     return obj.content.delivery.owner == request.user and obj.content.delivery.can_change 

Beim Erstellen der Methode has_object_permission wird nicht berücksichtigt, aber die has_permission ist. Also erhalte ich den Parameter, der von urls.py gesendet wurde, frage und überprüfe die Eigenschaften des gewünschten Objekts.

Dank

0

has_object_permissions() wird aufgerufen, wenn .get_object() Verfahren in einer generischen Ansicht d.h. eine bestimmte Ressource aufgerufen wird, zugegriffen wird. Jetzt

alle detail Anfragen (retrieve, update, delete) Zugriff auf eine bestimmte Ressource/Objekt, es funktioniert. Für create Anfragen, get_object() Methode wird nicht aufgerufen, so dass es in Ihrem Fall nicht funktioniert.

Für die Bearbeitung von create Anfragen können Sie einen weiteren Serializer erstellen, für den die oben genannten 2 Bedingungen geprüft werden. Und dann ändern Sie Ihre Berechtigungsklassen nur für detail Anfragen.

+0

Nur lesen, dass auf dem Dokument auch, ich bin immer noch auf der Suche nach der Antwort für die CreateView –

+0

Vielleicht können Sie einen anderen Serializer für erstellen und dann beschränken Berechtigungen überprüfen, um nur 'Detail' Anfragen zu behandeln. –

Verwandte Themen