使用Django REST框架,我使用此視圖和權限來僅允許項目所有者獲取他們的項目。在使用Django REST獲取對象之前檢查權限
view.py
class ProjectViewSet(viewsets.ModelViewSet):
permission_classes = (
IsProjectOwner,
permissions.IsAuthenticated,
)
def get_queryset(self):
return Project.objects.filter(owner=self.request.user)
permissions.py
class IsProjectOwner(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return obj.owner == request.user
當用戶試圖獲取不屬於他一個項目,一個HTTP 404出現。但是,我想獲得HTTP 403_Forbidden。下面是測試我使用
def test_auth_get(self):
self.client.credentials(
HTTP_AUTHORIZATION=self.authenticated_user_token
)
response = self.client.get(
'/-/projects/%s/' % self.project_owner_project_id
)
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
我試圖解決使用像在REST實況http://www.django-rest-framework.org/api-guide/permissions/#object-level-permissions一個的get_object()方法的問題。但我不知道如何在知道實際對象之前檢查權限。
但是404比403好,它沒有揭示「對象確實存在但不可訪問」的事實 –