Django 按组控制权限类及定义方法详解

 更新时间:2023年06月21日 15:09:32   作者:alue  
这篇文章主要为大家介绍了Django 按组控制权限类及定义方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

任务描述

后端接口,能够方便的使用角色组权限控制, 例如

# 基于函数的控制
@api_view(['GET'])
@permission_groups(['开发组','测试组'])
def api(request):
    return Response()
# 或者在类中
class SomeViewSet():
    group_names = ['开发组','测试组']

只要增加一行代码, 声明组名称, 就能够让这个接口只对该角色开放权限.

方法

思路很简单, 就是仿照 DRF 的权限控制, 自定义自己的权限验证行为即可.

权限类定义

仿照drf的权限类 IsAuthenticated 的写法:

class IsAuthenticated(BasePermission):
    def has_permission(self, request, view):
        return bool(request.user and request.user.is_authenticated)

我们的权限类,需要一个组名称的参数, 所以需要用工厂模式, 根据参数, 动态生成类.

def sigma_permission():
    class SigmaPermission(BasePermission):
        def __init__(self, group_names: List[GroupName] = None):
            self._sigma_groups = group_names
        def has_permission(self, request, view):
            if request.user.is_anonymous:
                return False
            return set(request.user.groups.all().values_list('name', flat=True)) & set(self._sigma_groups)
    return SigmaPermission
# 能够接受参数的权限类 
SigmaPermissionFactory = sigma_permission()

我们用类似闭包的形式, 构建了自己的权限类 SigmaPermission, 并且能够接收组名称列表作为参数, 内部方法 has_permission 实现了权限验证的工作.

下面, 就要要看看权限类该怎么使用. 根据两种场景, 分别采用装饰器和基类继承的方式.

基于函数的权限控制

可以参考drf的 permission_classes 装饰器的写法

def permission_classes(permission_classes):
    def decorator(func):
        func.permission_classes = permission_classes
        return func
    return decorator

我们定义自己的组权限装饰器:

def permission_groups(group_names: List[GroupName]):
    """ 组权限装饰器 """
    def decorator(func):
        groups_permission = SigmaPermissionFactory(group_names)
        if hasattr(func, 'permission_classes') and func.permission_classes is not None:
            func.permission_classes = [*func.permission_classes, lambda: groups_permission]
        else:
            func.permission_classes = [lambda: groups_permission]
        return func
    return decorator

注意: 这里注册 permission_classes 时, 必须要用 lambda 函数的方式. 这是因为, 我们的类工厂生成 groups_permission 时, 已经完成了初始化. 而Python的类只有在初始化时是 callable 的, 一旦初始化完成之后, 就不能再次callable. 而 permission_classes里的元素必须可以 callable , 所以用 lambda 函数的方式实现.

基于类的权限控制

这个方法就简单许多, 只用重载 get_permissions 方法就行.

class SigmaViewSet(ModelViewSet):

def get_permissions(self):
    permissions = [permission() for permission in self.permission_classes]
    if hasattr(self, 'group_names '):
        groups_permission = SigmaPermissionFactory(self.group_names )
        permissions.append(groups_permission)
    return permissions

总结

通过这个案例, 我们能够学到工厂函数/类的callable/lambda 函数的使用场景.

以上就是Django 按组控制权限类及定义方法详解的详细内容,更多关于Django 按组控制权限的资料请关注脚本之家其它相关文章!

相关文章

  • python获取word文档总页数的两种方法

    python获取word文档总页数的两种方法

    这篇文章主要介绍了python获取word文档的总页数的两种方法,文中给出了两种解决方案,两种方案也都各有优缺点,可能也不一定是完全准确的,需要的朋友可以参考下
    2024-03-03
  • Python数据分析从入门到进阶之分类算法全面教程

    Python数据分析从入门到进阶之分类算法全面教程

    数据分析是处理和解释数据以发现有用信息和洞察的过程,其中,分类算法是数据分析领域的一个重要组成部分,它用于将数据分为不同的类别或组,本文将介绍分类算法的基本概念和进阶技巧,以及如何在Python中应用这些算法,包括示例代码和实际案例
    2023-11-11
  • Python自动化导出zabbix数据并发邮件脚本

    Python自动化导出zabbix数据并发邮件脚本

    这篇文章主要介绍了Python自动化导出zabbix数据并发邮件脚本,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python中添加模块导入路径的方法

    python中添加模块导入路径的方法

    这篇文章主要介绍了python中添加模块导入路径的方法 ,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • Python实现改变与矩形橡胶的线条的颜色代码示例

    Python实现改变与矩形橡胶的线条的颜色代码示例

    这篇文章主要介绍了Python实现改变与矩形橡胶的线条的颜色代码示例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 深度学习之GPU,CUDA和cuDNN的理解

    深度学习之GPU,CUDA和cuDNN的理解

    Cuda和cudnn是支持NVIDIA支持GPU的两个库,分别用于高性能计算和深度神经网络计算的支持,下面这篇文章主要给大家介绍了关于深度学习之GPU,CUDA和cuDNN的理解,需要的朋友可以参考下
    2023-02-02
  • python实现的Iou与Giou代码

    python实现的Iou与Giou代码

    今天小编就为大家分享一篇python实现的Iou与Giou代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 计算机二级python学习教程(1) 教大家如何学习python

    计算机二级python学习教程(1) 教大家如何学习python

    这篇文章主要为大家详细介绍了计算机二级python学习教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • python爬取酷狗音乐排行榜

    python爬取酷狗音乐排行榜

    这篇文章主要为大家详细介绍了python爬取酷狗音乐排行榜,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • win8.1安装Python 2.7版环境图文详解

    win8.1安装Python 2.7版环境图文详解

    在本篇内容里小编给大家分享了关于win8.1安装Python 2.7版环境的详细步骤和方法,有兴趣的朋友们跟着学习下。
    2019-07-07

最新评论