2015-04-25 7 views
7

Desidero assicurarmi che request.user possa solo inviare una richiesta POST per creare un argomento del forum in cui sono gli auther. Con PUT e DELETE sono in grado di farlo utilizzando il has_object_permission ma con il POST non riesco a farlo, suppongo che l'oggetto non sia ancora stato creato.Autorizzazione livello oggetto Python Rest Framework su POST

class TopicPermission(IsAuthenticatedOrReadOnly): 
    """ 
    Any user should be able to read topics but only authenticated 
    users should be able to create new topics. An owner or moderator 
    should be able to update a discussion or delete. 
    """ 
    def has_object_permission(self, request, view, obj): 
     if request.method in SAFE_METHODS: 
      return True 

     # Instance must have an attribute named `author` or moderator 
     return obj.author == request.user or request.user.forum_moderator 

Come potrei fare per verificare request.user == obj.author nelle richieste POST?

+1

si dispone di una 'author' campo sul serializzatore che si sta tentando di assicurare sia impostato per l'utente corrente quando il cresting oggetto? Ci sono modi migliori per farlo rispetto al controllo dei permessi. –

+0

sì, non si tratta di questo. Funziona bene per PUT e DELETE, ma con POST has_object_permission non funziona. – awwester

+1

Con "non funziona" intendi "non viene chiamato", "attiva un errore" o "non passa mai"? Non è chiaro cosa tu stia cercando di fare nella tua domanda, e [odora di un problema XY] (http://meta.stackexchange.com/q/66377/159034). –

risposta

3

ho finito per fare la convalida nel viewset al posto del serializzatore:

class TopicViewSet(viewsets.ModelViewSet): 
    permission_classes = (TopicPermission,) 
    queryset = Topic.objects.all() 
    serializer_class = TopicSerializer 

    def create(self, request, *args, **kwargs): 
     """ 
     verify that the POST has the request user as the obj.author 
     """ 
     if request.data["author"] == str(request.user.id): 
      serializer = self.get_serializer(data=request.data) 
      serializer.is_valid(raise_exception=True) 
      self.perform_create(serializer) 
      headers = self.get_success_headers(serializer.data) 
      return Response(serializer.data, status=201, headers=headers) 
     else: 
      return Response(status=403) 
Problemi correlati