0

내가 잘못된 코드 일지 모르지만 정말로 장고를 많이하지는 않았다. 내가 장고의 사용자 모델에서 내장 된 권한을 감지하고 싶습니다. 사용자 모델에 권한을 추가했지만 어떤 이유로 has_perm이 작동하지 않습니다. 대신 user_objects.all()을 사용하여 권한 개체가 있는지 검색합니다. 나는 400 오류를 반환하고 싶습니다 : 권한이없는 경우 권한이 없습니다.허가를위한 믹스 Django REST ListCreateAPIView

Heres는 내 현재 솔루션 (작동하지 않음) :

class PermissionRequiredMixin(object): 
    user_check_failure_path = 'auth_login' 
    permission_required = None 

    def check_user(self, user): 
     return user.has_perm(self.permission_required) 
:

class ProgramListCreateView(PermissionRequiredMixin,ListCreateAPIView): 
    permission_required = Permission.objects.get(name="Can CRUD") 
    permission_classes = (IsAuthenticated,) 
    queryset = Program.objects.all() 
    serializer_class = ProgramSerializer 

    def check_user(self,request): 
     if self.permission_required in request.user.user_permissions.all(): 
      return True 
     return Response(status=400) 

나는 허가없이 사용자 토큰과 JSON을 보내, 그것은 여전히 ​​객체를

을 Heres 내 믹스 인을 생성

참고 : has_perm은 내가 추가 한 경우에도 항상 어떤 이유로 든 false를 반환합니다. user.user_permissions.add(permission_object)

+0

당신이 djangorest 사용자 지정 권한에 대해 파나요이 클래스를 확장거야? –

+0

네,하지만 문서가 너무 제한되어 믹스 인을 대신 사용했습니다. – Jason

+0

제 대답을 확인하십시오. –

답변

0

특정 사용자에게 귀하의 APIView에 대한 사용 권한이 있는지 확인하려는 것 같습니다.

당신은 단순히 당신은 또한 사용자 지정 권한 read more

을 사용할 수 있습니다 DjangoModelPermissions read more

class ProgramListCreateView(ListCreateAPIView): 
    permission_classes = (IsAuthenticated, DjangoModelPermissions) 
    ... 

을 사용할 수 있습니다

from rest_framework import permissions 

class UserPermission(permissions.BasePermission): 

    def has_object_permission(self, request, view, obj): 
     ''' 
     Object-level permission to only allow user model manipulation 
     ''' 

     # IF you would like to allow GET, HEAD or OPTIONS requests, 
     if request.method in permissions.SAFE_METHODS: 
      return True 

     # check if user is owner 
     return request.user == obj 

USAGE

from custom_permission import UserPermission 

class ProgramListCreateView(ListCreateAPIView): 
    permission_classes = (UserPermission,) 
    ... 

또는 당신은 세계적으로 권한을 확인하려면 당신이 당신의 settings.py에 포함시킬 수

REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
     'rest_framework.permissions.DjangoModelPermissions', 
    ) 
} 
0

내가 그랬어 Heres는 무엇을 : 나는 기본적으로 일반적인 API 뷰 및 I를 확장하는 믹스 인을 만들어 단지 풋 게시물을 무시하고 기능

class MasterGenericAPIViewMixin(ListCreateAPIView, RetrieveUpdateDestroyAPIView): 
codename = None 

def post(self, request, *args, **kwargs): 
    permission = Permission.objects.get(codename=self.codename) 
    if permission not in request.user.user_permissions.all(): 
     return Response(status=403, data={ 
      "error": "not authorized to add" 
     }) 

    return self.create(request, *args, **kwargs) 

def put(self, request, *args, **kwargs): 
    permission = Permission.objects.get(codename=self.codename) 
    if permission not in request.user.user_permissions.all(): 
     return Response(status=403, data={ 
      "error": "not authorized to edit" 
     }) 
    return self.update(request, *args, **kwargs) 

def delete(self, request, *args, **kwargs): 
    permission = Permission.objects.get(codename=self.codename) 
    print(permission) 
    print(request.user) 
    if permission not in request.user.user_permissions.all(): 
     return Response(status=403, data={ 
      "error": "not authorized to delete" 
     }) 
    return self.destroy(request, *args, **kwargs) 

내 모든 뷰