5

Używam frameworka Django REST z nested router extension. Jedna z moich tras wygląda następująco: companies/$company/locations/$location gdzie $company i $location są zmiennymi slug.Uprawnienia REST dla Django na zagnieżdżonych trasach

Chcę zezwolić użytkownikom na POST na ten URL: companies/$company/locations/, aby dodać nowe lokalizacje. Chcę się upewnić, że użytkownik wykonujący test POST ma uprawnienia do korekty dla firmy, do której PODLEGA. Obecnie używam django-guardian dla moich uprawnień na poziomie obiektu. Wiadomość POST zawiera tylko nazwę nowej lokalizacji, w której nie ma nazwy firmy, ponieważ można ją wywnioskować z adresu URL. Mam trudności z prawidłowym egzekwowaniem uprawnień w tym przypadku. Ustawiłem pole company nowego obiektu Location z metody pre_save, ale jest już za późno na zastosowanie sprawdzenia uprawnień.

Jaki jest najlepszy sposób na egzekwowanie tego?

tam przypadku użytkownik robi to towarzystwo w poście, mogę potwierdzić firmę poprzez dodanie następujących do viewset:

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

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? – Gabriel

+0

@alex, skąd wzięła się spółka w metodzie pre_save? Szukam również odpowiedzi na Twoje aktualne pytanie – Neil

+0

Czy możesz opublikować adresy URL i widoki oraz serializer? –

Odpowiedz

0

Cóż, faktycznie znalazłem dość brzydki sposób to zrobić , pobieranie obiektu nadrzędnego i sprawdzanie jego przynależności do użytkownika żądania.

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)