跳转到主要内容

django-guardian对Django REST Framework的支持

项目描述

django-rest-framework-guardian

CircleCI Codecov License Version Python

django-rest-framework-guardian提供了对Django REST Framework的django-guardian集成。目前,这仅包括ObjectPermissionsFilter

安装与设置

要使用django-rest-framework-guardian,将其安装到您的环境中。

$ pip install djangorestframework-guardian

确保Django REST Framework和django-guardian已配置并添加到您的INSTALLED_APPS设置中。

INSTALLED_APPS = [
    'rest_framework',
    'guardian',
]

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
    'guardian.backends.ObjectPermissionBackend',
]

ObjectPermissionsFilter

该过滤器将确保查询集只返回用户具有适当查看权限的对象。

如果您正在使用ObjectPermissionsFilter,您可能还需要添加一个适当的对象权限类,以确保用户只能操作具有适当对象权限的实例。最简单的方法是从DjangoObjectPermissions派生并添加'view'权限到perms_map属性。

使用ObjectPermissionsFilterDjangoObjectPermissions的示例可能如下所示

permissions.py:

from rest_framework import permissions


class CustomObjectPermissions(permissions.DjangoObjectPermissions):
    """
    Similar to `DjangoObjectPermissions`, but adding 'view' permissions.
    """
    perms_map = {
        'GET': ['%(app_label)s.view_%(model_name)s'],
        'OPTIONS': ['%(app_label)s.view_%(model_name)s'],
        'HEAD': ['%(app_label)s.view_%(model_name)s'],
        'POST': ['%(app_label)s.add_%(model_name)s'],
        'PUT': ['%(app_label)s.change_%(model_name)s'],
        'PATCH': ['%(app_label)s.change_%(model_name)s'],
        'DELETE': ['%(app_label)s.delete_%(model_name)s'],
    }

views.py:

from rest_framework import viewsets
from rest_framework_guardian import filters

from myapp.models import Event
from myapp.permissions import CustomObjectPermissions
from myapp.serializers import EventSerializer


class EventViewSet(viewsets.ModelViewSet):
    """
    Viewset that only lists events if user has 'view' permissions, and only
    allows operations on individual events if user has appropriate 'view', 'add',
    'change' or 'delete' permissions.
    """
    queryset = Event.objects.all()
    serializer_class = EventSerializer
    permission_classes = [CustomObjectPermissions]
    filter_backends = [filters.ObjectPermissionsFilter]

ObjectPermissionsAssignmentMixin

一个序列化混入模块,允许轻松地为用户和/或组分配权限。因此,每次创建或更新对象时,Serializer.get_permissions_map 返回的 permissions_map 都将用于为该对象分配权限。

请注意,现有的权限将保持不变。

一个使用示例可能如下所示

from rest_framework_guardian.serializers import ObjectPermissionsAssignmentMixin

from blog.models import Post


class PostSerializer(ObjectPermissionsAssignmentMixin, serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = '__all__'

    def get_permissions_map(self, created):
        current_user = self.context['request'].user
        readers = Group.objects.get(name='readers')
        supervisors = Group.objects.get(name='supervisors')

        return {
            'view_post': [current_user, readers],
            'change_post': [current_user],
            'delete_post': [current_user, supervisors]
        }

发布流程

  • 更新更改日志
  • 在 setup.py 中更新包版本
  • 为版本创建 git 标签
  • 构建并上传发布到 PyPI
    $ pip install -U pip setuptools wheel twine
    $ rm -rf dist/ build/
    $ python setup.py bdist_wheel
    $ twine upload dist/*
    

许可证

查看:许可证

BSD 3-Clause 许可证

版权所有(c)2018,Ryan P Kilby。保留所有权利。

在以下条件满足的情况下,允许以源代码和二进制形式重新分发和使用,无论是否修改:

  • 源代码重新分发必须保留上述版权声明、本条件列表和以下免责声明。

  • 二进制形式的重新分发必须复制上述版权声明、本条件列表和以下免责声明在文档和/或其他与分发一起提供的材料中。

  • 未经事先书面许可,不得使用版权所有者的名称或其贡献者的名称来认可或推广源自本软件的产品。

本软件由版权所有者和贡献者提供“按原样”以及任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论是否已通知此类损害的可能性,无论损害是根据合同、严格责任还是侵权(包括疏忽或其他)提起的,无论损害是否与使用本软件有关。

项目详细信息


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关 安装软件包 的更多信息。

源代码分发

djangorestframework-guardian-0.3.0.tar.gz (8.6 KB 查看散列值

上传时间: 源代码

构建分发

djangorestframework_guardian-0.3.0-py2.py3-none-any.whl (6.9 KB 查看散列值

上传时间: Python 2 Python 3

支持者