5

Utilizzo il framework Rango di Django con lo nested router extension. Uno dei miei percorsi è il seguente: companies/$company/locations/$location dove $company e $location sono variabili di slug.Autorizzazioni per il REST di Django su Rotte nidificate

Desidero consentire agli utenti di POST di questo URL: companies/$company/locations/ aggiungere nuove posizioni. Voglio assicurarmi che l'utente che fa il POST abbia i permessi di correzione per la compagnia a cui sta facendo il POST. Attualmente utilizzo django-guardian per le mie autorizzazioni a livello di oggetto. Il messaggio POST contiene solo il nome della nuova posizione in cui non contiene il nome dell'azienda in quanto ciò può essere dedotto dall'URL. Sto avendo difficoltà a far rispettare correttamente le autorizzazioni in questo caso. Avevo impostato il campo company del nuovo oggetto Location dal metodo pre_save del Viewset, ma è troppo tardi perché venga applicato il controllo dell'autorizzazione.

Qual è il modo migliore per far rispettare questo?

Nel caso ci all'utente include la società nel post, posso validare l'azienda aggiungendo quanto segue al viewset:

def get_queryset(self): 
    parent = super(LocationViewSet, self).get_queryset()  
    return parent.filter(company__slug=self.kwargs['company_slug']) 
+0

Avete mai trovato una soluzione per questo? – Gabriel

+0

@alex come hai ottenuto la slug aziendale nel metodo pre_save? Sto anche cercando la risposta alla tua domanda attuale – Neil

+0

Puoi pubblicare url e visualizzazioni e serializzatore? –

risposta

0

Beh, in realtà ho trovato un modo piuttosto brutto per farlo , recuperando l'oggetto genitore e verificandone l'appartenenza rispetto all'utente della richiesta.

def create(self, request, *args, **kwargs): 
    request.data['catspad'] = kwargs['catspad_pk'] 
    if not Catspad.objects.get(id=kwargs['catspad_pk']).owner == request.user: 
     return Response(status=HTTP_401_UNAUTHORIZED) 
    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=HTTP_201_CREATED, headers=headers)