如何在superset自定义权限并生效?

最近接到客户需求,需要根据不同的角色,赋予不同的看板使用权限,比如,Admin用户需要在任何时候都能探索,编辑,和下载图表。目测了一下,superset原生的好像并没有这个权限的定义。
只好自己研究一下添加以上的权限:


1. Superset的权限系统

superset控制权限主要依靠用户(user),角色(role),权限(permissions),视图(view_menu) 四个类来实现。
他们对应的关系如下
在这里插入图片描述

  • 一个用户对应多个角色,一个角色对应多个用户
  • 一个角色对应多个permission_view, 一个permission_view对应多个角色
  • 一个permission 对应多个 view menu, 一个view_menu对应多个permission

简单的说,就是permission 和view_menus是多对多的关系,然后每一条多对多的关系即为一条权限记录(permission_view_menu), 这个permission_view_menu和role又是多对多的关系。
一个角色包含一个权限记录,该角色下面的所有用户即拥有该权限。

2. 如何添加一条权限信息


def create_role_permission_view_menu(role_name, pv):
    """
    general method to create permission ,view menu, and add perms into role
    :param role_name: str, role name 
    :param pv: dict, key is permission_name, value is view_menu_name e.g.
    :return: 
    """
    for permission_name, view_menu_name in pvs.items():
        merge_perm(sm, permission_name, view_menu_name)
        role = sm.find_role(role_name)
        perm_view = sm.find_permission_view_menu(permission_name, view_menu_name)
        sm.add_permission_role(role, perm_view)
role_name = "Admin"
permission_view_menu = {
    'can_edit_chart': "chart",
    'can_export_csv': "chart",
    "can_explore_chart": "chart",
    "can_display_navbar": "superset"
}

create_role_permission_view_menu(role_name, permission_view_menu)

通过以上代码可以实现在数据库里面添加权限,视图及对应关系到角色中。

3. 如何使用新添加的权限

3.1 新权限的直接使用

由于superset类继承至BaseSupersetView, 拥有 can_access的方法如下:

    def can_access(self, permission_name, view_name, user=None):
        if not user:
            user = g.user
        return utils.can_access(
            appbuilder.sm, permission_name, view_name, user)

在superset类中要判断该用户是否有某个视图(比如刚才添加的chart)的某个权限(比如can_export_csv), 只需要调用此方法即可判断

can_export_csv = self.can_access("can_export_csv", "chart")
3.2 更方便的使用

在目录 '/superset/views/base.py’中,将添加的数据库权限信息写成对应的方法方便直接调用

    def can_edit_chart(self, user=None):
        return self.can_access("can_edit_chart", "chart", user=user)

    def can_export_csv(self, user=None):
        return self.can_access("can_export_csv", "chart", user=user)

    def can_explore_chart(self, user=None):
        return self.can_access("can_explore_chart", "chart", user=user)

在判断权限的时候,就可以直接调用方法判断:

can_export_csv = self.can_export_csv()

由此可见,第二种方式更精简,也更Pythoner.


以上就是如何在superset中添加新的权限管理。

本人是的从事superset源代码的研究和二次开发全栈工程师,有工作需要可联系微信: taojian2009

更多提升自己的途径:
dataquest: https://item.taobao.com/item.htm?id=564528265057
datacamp: https://item.taobao.com/item.htm?id=563595308747
lynda.com: https://item.taobao.com/item.htm?id=588604400195

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值