【发布时间】:2021-06-18 16:38:22
【问题描述】:
我希望用户只能访问属于他们的记录,而不是任何其他用户的记录,所以
我创建了以下view:
class AddressViewSet(viewsets.ModelViewSet):
authentication_classes = (TokenAuthentication,)
permission_classes = [IsAuthenticated, IsOwner]
queryset = Address.objects.all()
def retrieve(self, request, pk):
address = self.address_service.get_by_id(pk)
serializer = AddressSerializer(address)
return Response(serializer.data, status=status.HTTP_200_OK)
我希望只有记录的所有者才能访问此视图中的所有方法,即检索、列表等(稍后我将实现其余方法),因此我在 @987654325 中创建了以下 permissions.py 文件@应用:
class IsOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
print('here in has_object_permission...')
return obj.user == request.user
这不起作用,所以在通过*答案后,我发现了这个Django Rest Framework owner permissions,它表明必须实现has_permission方法。但正如您在该答案中看到的那样,它试图从view.kwargs 中获取id,但我的view.kwargs 只包含pk 而不是用户。我怎样才能解决这个问题?我是否需要在请求 url 中隐式传递用户 ID?听起来不对。
这是我用来验证用户无法访问其他用户记录的测试:
def test_when_a_user_tries_to_access_another_users_address_then_an_error_is_returned(self):
user2 = UserFactory.create()
addresses = AddressFactory.create_batch(3, user=user2)
address_ids = [address.id for address in addresses]
random_address_id = random.choice(address_ids)
url = reverse(self.ADDRESSES_DETAIL_URL, args=(random_address_id,))
res = self.client.get(url, format='json')
print(res.data)
目前只是使用测试来检查返回的数据,稍后会实现断言。
编辑
所以我在IsOwner 中添加了has_permission 方法:
def has_permission(self, request, view):
return request.user and request.user.is_authenticated
如果我在这里放置一个打印语句,它会被打印,但似乎没有达到has_object_permission 方法,我在那里添加的所有打印都不会显示
【问题讨论】:
标签: django django-rest-framework django-rest-auth django-permissions django-rest-viewsets