最近接到客户需求,需要根据不同的角色,赋予不同的看板使用权限,比如,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