2015-07-30 9 views
5

Sono stato in grado di impostare django-guardian e il mio progetto django-rest-framework come example in drf docs, ma non riesco a ottenere il comportamento desiderato. Qualcuno potrebbe far notare se sto facendo qualcosa di sbagliato o se quello che voglio non può essere fatto con guardian?Utilizzo di DjangoObjectPermissionsFilter per filtrare gli oggetti dell'utente utilizzando django-guardian

Setup

settings.py

INSTALLED_APPS = (
    ... 
    'guardian', 
    'simple', 
) 

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'guardian.backends.ObjectPermissionBackend', 
) 

'DEFAULT_PERMISSION_CLASSES': (
    'infrastructure.permissions.DjangoObjectPermissions', 
) 

infrastructure.permissions.py

from rest_framework import permissions 


class DjangoObjectPermissions(permissions.DjangoObjectPermissions): 
    """ 
    Similar to `DjangoObjectPermissions`, but adding 'view' permissions. 
    """ 
    perms_map = { 
     'GET': ['%(app_label)s.view_%(model_name)s'], 
     'OPTIONS': ['%(app_label)s.view_%(model_name)s'], 
     'HEAD': ['%(app_label)s.view_%(model_name)s'], 
     'POST': ['%(app_label)s.add_%(model_name)s'], 
     'PUT': ['%(app_label)s.change_%(model_name)s'], 
     'PATCH': ['%(app_label)s.change_%(model_name)s'], 
     'DELETE': ['%(app_label)s.delete_%(model_name)s'], 
    } 

models.py

class Event(models.Model): 
    name = models.CharField(max_length=255) 
    min_age = models.IntegerField() 

    def __str__(self): 
     return self.name 

    class Meta: 
     permissions = (('view_event', 'Can view event'),) 

views.py

class EventViewSet(viewsets.ModelViewSet): 
    queryset = models.Event.objects.all() 
    serializer_class = serializers.EventSerializer 
    filter_backends = (filters.DjangoObjectPermissionsFilter,) 

Comportamento previsto

  • L'elenco dei Events restituito da EventViewSet.list contiene solo gli oggetti che l'utente richiesta può visualizzare (richiesta dell'utente ha django.auth view_event permesso o ('view_event', event_object).
  • EventViewSet.details restituisce l'istanza Event solo se l'utente della richiesta ha l'autorizzazione view_event OPPURE l'autorizzazione ('view_event', event_object).

comportamento effettivo

  • Se l'utente ha il permesso Django auth view_event e il permesso guardiano ('view_event', event_obj), si può accedere ai percorsi list (ricevendo tutte le voci) e details associati alla event_obj.
  • Se l'utente NON ha il permesso di autorizzazione view_event, ma ha il permesso di guardia ('view_event', event_obj), riceve un 403 in tutte le rotte (inclusa la route details associata all'evento_obj su cui hanno il permesso).
  • Se l'utente dispone di view_event ma non dispone di ('view_event', event_obj), può accedere al percorso list (vedere tutte le voci), ma riceve un 404 nel percorso details, indipendentemente dalla voce a cui si accede.

Grazie!

+0

Ho iniziato a giocare con guardiano e vedo questo stesso comportamento. Ma non ho provato con 'filter_backends' quindi proverò. –

risposta

3

Ok, risulta che tutte le viste con classe di autorizzazione DjangoObjectPermissions consentiranno solo agli utenti di visualizzare una determinata risorsa se dispongono di autorizzazioni a livello di modello e di livello oggetto. Il fatto che i miei utenti siano in grado di elencare tutti gli oggetti, ma non di recuperarli, è a causa di uno known bug che è già stato corretto ma non è ancora nella versione corrente.