0

J'ai un modèle django et je veux que ce modèle soit accessible uniquement par son propriétaire (utilisateur qui a créé le modèle). Donc, j'ai créé une classe d'autorisation comme suitDjango: Comment limiter l'autorisation d'accès à la liste des modèles à son propriétaire?

class IsOwnerOnly(permissions.BasePermission): 


def has_object_permission(self, request, view, obj): 

    # Write permissions are only allowed to the owner of the snippet. 
    return obj.owner == request.user 

et appliqué cette autorisation sur modelviewset

class ItemViewSet(viewsets.ModelViewSet): 

    queryset = Item.objects.all() 
    serializer_class = ItemSerializer 
    permission_classes = (IsOwnerOnly,) 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

Alors que l'accès à un seul article, il fonctionne, mais même alors chaque utilisateur authentifié peut accéder à la liste des articles. Alors, comment pourrais-je limiter l'accès de l'élément à son seul propriétaire?

J'ai inclus Tokenauthentication dans la page des paramètres comme indiqué

REST_FRAMEWORK = { 
'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.IsAuthenticated', 
), 
'DEFAULT_AUTHENTICATION_CLASSES': (

    'rest_framework.authentication.TokenAuthentication', 

), 
} 

et l'élément ressemble

class Item(models.Model): 

    name=models.CharField(max_length=30) 
    address=models.TextField() 
    owner = models.ForeignKey('auth.User', related_name='items', on_delete=models.CASCADE) 

    def __str__(self): 
     return self.name 
+0

'retour obj.owner == request.user', est' owner' un champ modèle 'Item'? et vous ne pouvez pas contrôler qui peut accéder à la liste des articles par le propriétaire, si vous quoi, vous devez remplacer 'has_permission' à la classe' IsOwnerOnly' – Ykh

+0

yup. c'est un champ –

+0

je l'ai inclus maintenant. pls vérifier –

Répondre

0

Vous ne pouvez pas contrôler qui peut accéder à la liste des objets par le propriétaire, si vous ce que vous besoin de passer outre has_permission à la classe IsOwnerOnly, comme:

class IsAuthenticatedOwner(permissions.BasePermission): 
    def has_permission(self, request, view): 
     # work when your access /item/ 
     if request.user and is_authenticated(request.user): 
      if request.user.id in [1, 2, 3]: 
       return True 
      else: 
       return False 
     else: 
      return False 

    def has_object_permission(self, request, view, obj): 
     # work when your access /item/item_id/ 
     # Instance must have an attribute named `owner`. 
     return obj.owner == request.user 

Avis: has_permission travail lorsque votre accès /item/ (liste), has_object_permission travail lorsque vous accédez /item/item_id/ (récupérer et mettre à jour).

Si vous voulez laisser l'utilisateur voir les articles seulement il a créé, simple:

class ItemsViewSet(ModelViewSet): 
    queryset = Items.objects.all() 
    serializer_class = ItemsSerializer 
    permission_classes = (IsAuthenticated) 

    def get_queryset(self): 
     queryset = self.get_queryset().filter(owner=self.request.user) 
     return queryset 
+0

ok. mais ce dont j'ai besoin est de limiter la permission seulement à ses propriétaires –

+0

je peux le faire en accédant/item/item_id/mais pas en accédant/item/ –

+0

votre voulez que votre utilisateur ne peut voir que les éléments qu'il crée? – Ykh