permissions - django-guardian 和 django-rest-framework

标签 permissions django-rest-framework django-guardian

我想在一个安静的项目中使用 django-guardian 管理我的对象权限(使用 django-rest-framework)。

我想要什么:

  • 仅当连接的用户具有以下权限时才允许他创建对象
    “add_modelname”权限。
  • 当连接的用户创建对象时,设置“delete_modelname”
    和“change_modelname”权限。
  • 仅当连接的用户具有
    “change_modelobject”权限。
  • 仅当连接的用户具有以下权限时才允许他删除对象
    “删除模型对象”权限。

  • 我正在尝试使用以下代码管理这些案例:

    查看.py
    class ModelNameViewSet(viewsets.ModelViewSet):
        """
        This viewset automatically provides `list`, `create`, `retrieve`,
        `update` and `destroy` actions.
    
        Additionally we also provide an extra `highlight` action.
        """
        queryset = ModelName.objects.all()
        serializer_class = ModelNameSerializer
        permission_classes = (permissions.IsAuthenticatedOrReadOnly, ModelNamePermission)
    
        def create(self, request, *args, **kwargs):
            assign_perm("change_modelname", request.user, self)
            assign_perm("delete_modelname", request.user, self)
            return super().create(request, *args, **kwargs)
    

    权限.py
    class ModelNamePermission(permissions.BasePermission):
        """
        Custom permission to only allow owners of an object to edit it.
        """
    
        def has_permission(self, request, view):
            if request.method in ['GET']:
                return request.user.has_perm('view_modelname')        
            if request.method in ['POST']:
                return request.user.has_perm('add_modelname')
            if request.method in ['PUT', 'PATCH']:
                return request.user.has_perm('change_modelname')
            if request.method in ['DELETE']:
                return request.user.has_perm('delete_modelname')
            return False
    
        def has_object_permission(self, request, view, obj):         
            if request.method in ['GET']:
                return request.user.has_perm('view_modelname', obj)        
            if request.method in ['POST']:
                return request.user.has_perm('add_modelname', obj)
            if request.method in ['PUT', 'PATCH']:
                return request.user.has_perm('change_modelname', obj)
            if request.method in ['DELETE']:
                return request.user.has_perm('delete_modelname', obj)
            return False
    

    我遇到的第一个问题是我在这一行中有一个错误:
    assign_perm("change_modelname", request.user, self)
    

    错误 :
    error: 'ModelNameViewSet' object has no attribute '_meta'
    

    而且我认为其余的代码将不起作用,但至少您可以看到我想要做什么。

    我还没有看到任何关于这些具体案例的例子。

    编辑 :
    另一件事是这段代码:
    request.user.has_perm('view_coachingrequest')
    

    总是返回真。但是我从来没有为我的用户设置过这个权限(只用管理员用户试过,也许这就是原因)。

    最佳答案

    create View 集的方法将返回一个新创建的模型实例。您正在尝试将权限分配给 View 集对象本身。您的代码 create方法应如下:

    def create(self, request, *args, **kwargs):
        instance = super().create(request, *args, **kwargs)
        assign_perm("change_modelname", request.user, instance)
        assign_perm("delete_modelname", request.user, instance)
        return instance
    

    这将创建模型实例,然后在返回之前为其分配所需的权限。

    关于permissions - django-guardian 和 django-rest-framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39354636/

    相关文章:

    android - android.permission.WRITE_SETTINGS 或 android.permission.WRITE_SECURE_SETTINGS 中可以更改哪些设置?

    angularjs - 使用 Django Rest Framework 通过自定义序列化器 CharField 获取此函数的无效关键字参数

    django - 将 Django 消息框架与 rest_framework 结合使用

    django - 如何在 Django Guardian 中为用户定义默认权限?

    django - Django 中基于行的权限

    django - django-guardian 的行级权限 - 观察到对管理界面没有影响

    android - 以编程方式允许 super 用户权限

    apache - AH00035 : access to/denied (filesystem path '/Users/xxx/Documents/workspace' ) because search permissions are missing on a component of the path

    php - Drupal 7 字段 - 只能由特定角色编辑 - 如何?

    python - 使用 Django 对象权限时,如何使用 django-rest 框架添加非模型/查询集返回 View ?