2015-07-30 19 views
5

kullanıcı nesnelerini filtrelemek için django-guardian ve django-rest-framework projemi example in drf docs olarak ayarlamayı başardım, ancak istediğim davranışı gerçekleştiremiyorum. Birisi yanlış bir şey yapıyorum ya da istediğimi guardian ile tamamlanamazsa lütfen işaret edebilir misiniz?Django-guardian Kullanıcının süzgeçlerini kullanarak django-guardian

Kur

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,) 

EventViewSet.list tarafından döndürülen Events listesi sadece içeren (istek kullanıcı view_event izni VEYA ('view_event', event_object) django.auth sahiptir istek kullanıcı görüntüleyebileceğiniz nesneleri

  • Beklenen davranış.
  • EventViewSet.detailsEvent örneğini, yalnızca istek kullanıcısı view_event iznine sahipse VEYA ('view_event', event_object) iznini verir.

kullanıcı django auth izni view_event ve vasi izni ('view_event', event_obj) sahiptir

  • Eğer gerçek hareketi, bu event_obj ilişkili yolları list (tüm girişleri alma) ve details erişebilirler.
  • Kullanıcı, view_event kimlik doğrulama yetkisine sahip değilse, ancak ('view_event', event_obj) güvenlik iznine sahipse, tüm yollarda (izinlere sahip oldukları event_obj ile ilişkili details yolu dahil) bir 403 alırlar.
  • Kullanıcı view_event içeriyorsa ancak ('view_event', event_obj) yoksa, list (tüm girişleri görerek) yoluna erişebilir, ancak erişilen girdiye bakılmaksızın, details rotasında bir 404 alırlar.

Teşekkür ederiz!

+0

Koruyucu ile oynamaya başladım ve aynı davranışı görüyorum. Ama ben 'filter_backends' ile denemedim, bu yüzden onu bir vereceğim. –

cevap

3

Tamam, DjangoObjectPermissions izin sınıfı olan tüm görünümlerin, kullanıcıların model düzeyi ve nesne düzeyi izinleri varsa, yalnızca belirli bir kaynağı görmelerine izin vereceği ortaya çıkıyor. Kullanıcılarımın tüm nesneleri listeleyebildikleri, ancak bunlardan herhangi birini almadıkları gerçeği, halihazırda düzeltilmiş ancak henüz mevcut sürümde bulunmayan bir known bug yüzünden.

İlgili konular