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 daEventViewSet.list
contiene solo gli oggetti che l'utente richiesta può visualizzare (richiesta dell'utente ha django.authview_event
permesso o('view_event', event_object)
. EventViewSet.details
restituisce l'istanzaEvent
solo se l'utente della richiesta ha l'autorizzazioneview_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 percorsilist
(ricevendo tutte le voci) edetails
associati allaevent_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 routedetails
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 percorsolist
(vedere tutte le voci), ma riceve un 404 nel percorsodetails
, indipendentemente dalla voce a cui si accede.
Grazie!
Ho iniziato a giocare con guardiano e vedo questo stesso comportamento. Ma non ho provato con 'filter_backends' quindi proverò. –