【问题标题】:DRF Custom permissionDRF 自定义权限
【发布时间】:2016-03-29 04:06:30
【问题描述】:

我正在尝试在 Django REST 框架中构建自定义权限 -

class GroupBasePermission(permissions.BasePermission):

    group_name = ""

    def has_permission(self, request, view):
        """
        Should simply return, or raise a 403 response.
        """
        print 'self.group_name == ', self.group_name
        try:
            request.user.groups.get(name=self.group_name)    
        except Group.DoesNotExist:
            print 'group does not exist'
            msg = ('Permission denied.')
            data = {'detail': six.text_type(msg)}
            #return Response(data, status=status.HTTP_403_FORBIDDEN)
            return HttpResponseForbidden()

class HRAdminGroupPermission(GroupBasePermission):
    """
        Checks to see if a user is in a particular group
    """

    group_name = "HR Admin1"

这是我的看法

class CompanyCreateApiView(LoginRequiredMixin,OTPRequiredMixin,GroupRequiredMixin,CreateAPIView):

    permission_classes = (IsAuthenticated, HRAdminGroupPermission,)
    authentication_classes = (SessionAuthentication,)
    group_required = 'HR Admin1'


    def post(self, request, *args, **kwargs):
        for each in self.request.user.groups.all():
            print 'self.request.user.group == ', each.name

当我使用用户 (GROUP-- HR ADMIN) 调用此 API 时,即使我在权限异常中看到打印消息,它也不会向我抛出 403 禁止错误。

我该如何解决这个问题?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    如果授予权限,则必须返回 True,否则在 has_permission 方法中返回 False

    【讨论】:

    • 是的,它有效..我有没有办法通知它的 401(未经授权)与 403(禁止)..True 或 False 将其设置为 403 返回码。
    • 尝试“raise exceptions.AuthenticationFailed()”而不是“HttpResponseForbidden”(未测试)。 django-rest-framework.org/api-guide/exceptions/…
    【解决方案2】:

    类似的东西

    class APIPermission(permissions.BasePermission):
    
        message = 'Only API user can access APIs'
    
        group_name = "api"
    
        def has_permission(self, request, view):
            try:
                group = request.user.groups.get(name=self.group_name)
            except Group.DoesNotExist:
                self.message = "Permission denied, user group '{}' does not exists".format(self.group_name)
                return False
            return group.name == self.group_name
    

    【讨论】:

      猜你喜欢
      • 2020-07-23
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 2021-03-16
      • 2015-07-08
      • 2020-09-06
      • 1970-01-01
      相关资源
      最近更新 更多