2015-11-25 89 views
4

使用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()方法的問題。但我不知道如何在知道實際對象之前檢查權限。

+0

但是404比403好,它沒有揭示「對象確實存在但不可訪問」的事實 –

回答

0

這裏你需要覆蓋你的get_queryset方法; 實際上,您可以查看您從get_queryset方法傳遞的查詢集的查找對象。

def get_queryset(self): 
    if self.action == 'update': 
     return Project.objects.filter(owner=self.request.user) 
    else: 
     return Project.objects.all() 
0

get_queryset方法已經將項目列表限制爲所有者是當前用戶的項目列表。這將工作列表,但也檢索或更新項目。

最重要的是你不需要權限。

+0

當然,沒有滿足過濾器要求的對象。但是我希望HTTP響應是'禁止'而不是'找不到頁面'。你有一個想法如何實現? – Rika

+0

然後,您不應該在get_queryset中進行篩選,以便調用get_object_permission。 – Linovia

+0

請注意,這將需要*你*處理列表動作的更細粒度過濾。 – Linovia

相關問題