2014-06-19 2 views
0

HyperlinkeRelatedFields 등을 사용하는 하이퍼 링크 된 serializer에 대한 사용자 지정 권한 클래스를 구현하고 있습니다.Django Rest Framework POST 개체의 프레임 워크 사용 권한

는 검사가 매우 약이다 : 그 문제를 이동 것이지만 시리얼을 검증하는 동안이 검사를 수행하도록 좋을 것 같은

def has_permission(self, request,view): 
    if request.method in permissions.SAFE_METHODS: 
     return True 

    if not request.user.is_authenticated(): 
     return False 

    if request.user.is_staff: 
     return True 

    # POST: 'author' is a URL due to serializer being Hyperlinked 
    # meaning we have to translate URL to model (like the serializer) 
    # to perform the check 
    if url_to_user(request.DATA['author']) == request.user: 
     return True 

코드에서 주석을 감안할 때, 그것은 보인다. 그것은 유효성 검사 클래스가 save()가 POST/PUT을 확인하기 위해 호출되기 전에 새 객체를 전달하는 메서드를 필요로하는 것과 비슷합니다. POST/PUT은 유효성 검사 관점에서 볼 때 HTTP/권한 관련 검사를 시리얼 라이저.

url_to_user는 직렬화에 고유하며 serializer의 유효성 검사기 부분은 새 모델의 온 전성/무결성 검사가 아닌 요청/http 특정이 될 것입니다.

내가 할 수있는 일은 흔한 일 인 것 같아서 어떤 경로를 택했는지 궁금하다. 그리고 "더 정확한"접근법이 있다면 나는 실종되었다.

미리 감사드립니다.

답변

0

의견이 POST이라고하면, 나는 당신이 다루는 새로운 객체의 생성이라고 가정합니다.

authorrequest.user이어야하므로 쓰기 가능 필드로 지정할 필요가 없습니다. 난 그냥 pre_save에있는 현재 사용자에게 객체의 저자 속성을 설정했습니다. 당신은 당신이 너무 현재 사용자에게 QuerySet을 제한 할 수 있습니다 PUT을 처리 할 마찬가지로 경우

:

def get_queryset(self): 
    return MyClass.objects.filter(author=self.request.user) 

가 (당신이 요청 방법에 따라이 작업을 수행해야 할 수 request.method in permissions.SAFE_METHODS 보면 ...)

그런 식으로 사용자는 자신에게 첨부되지 않은 개체를 만들 수 없으며 이미 소유하고 있지 않은 개체를 업데이트 할 수 없습니다.

그러나, 지금까지와 마찬가지로 TIMTOWTDI; 권한 기반 경로에는 아무런 문제가 없습니다. (여기에 최종 답이 있는지 확실하지 않습니다.)

관련 문제