Как сделать настраиваемое разрешение django -rest - PullRequest
0 голосов
/ 20 июня 2020

im new at django -rest, поэтому я пытаюсь создать разрешение для сотрудников только GET или PUT их информации, я использовал has_object_permission, но я все еще могу получить доступ ко всем другим пользователям

permissions.py :

class IsHRadmin(BasePermission):
    message = 'You are not allowed'
    def has_permission(self,request,view):

        methods = ['GET','POST','PUT','DELETE']
        req = request.user
        user = Role_User.objects.get(user_id_id=req.id)
   
        role ="HR_Admin"

        if str(user.role_id)==role:
            print("Hello World")
            if request.method in methods:
                return True    
        return False

class IsEmployee(BasePermission):
    message = 'You are not allowed'
    def has_object_permission(self,request,view,obj):
        
        methods = ['GET','PUT']
        
        if request.method in methods:
            if obj.owner == request.user:
                return True 
        return False 

views.py:

class EmployeeDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    generics.GenericAPIView):
    lookup_field = 'pk'
    serializer_class = EmployeeSerializer

    auth1 = IsAuthenticated & IsEmployee
    auth2 = IsAuthenticated & IsHRadmin
    
    permission_classes = [auth1 | auth2 | IsAdminUser]

    def get_queryset(self):
        return employee.objects.filter(pk=self.kwargs['pk'])


    def get(self, request, *args, **kwargs):
        
        response = self.retrieve(request, *args, **kwargs)
       
        return response

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

1 Ответ

1 голос
/ 20 июня 2020

Проблема в том, что IsHRadmin имеет проверку разрешений на уровне просмотра has_permission, а не проверку разрешений на уровне объекта has_object_permission. Сейчас. по умолчанию has_object_permission возвращает True, поэтому в то время как другие разрешения позволяют пользователю получить доступ к представлению, IsHRadmin позволяет ему получить доступ к объекту, даже если он не должен. Таким образом, вы должны определить разрешение на уровне объекта в IsHRadmin

def has_object_permission(self,request,view, obj):
    return self.has_permission(request, view)
...