【发布时间】:2017-11-21 09:07:59
【问题描述】:
我有一个 django 模型,并且我希望该模型只能由其所有者(创建模型的用户)访问。所以我创建了一个权限类如下
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
并将此权限应用于模型视图集
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)
在访问单个项目时它可以工作,但即使这样,每个经过身份验证的用户都可以访问项目列表。那么我怎样才能将项目的访问权限限制为只有它的所有者呢?
我已在设置页面中包含了 Tokenauthentication,如图所示
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.TokenAuthentication',
),
}
项目看起来像
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
【问题讨论】:
-
return obj.owner == request.user, 是owner模型Item的字段吗?并且您无法控制所有者可以访问项目列表的人员,如果您需要覆盖has_permission以班级IsOwnerOnly -
是的。这是一个字段
-
我现在已经包含了它。请检查
标签: django django-models django-rest-framework django-authentication