superset的權限和視圖是不可分割的,下面我們來看看視圖是怎麼生成的。視圖可以分為3類,菜單視圖,普通視圖(不生成菜單的視圖,隻添加連結),資源視圖。
前2類視圖是flaskappbuilder控制生成的,後一種視圖是sqlalchemy控制生成的。
菜單視圖/非菜單視圖生成
appbuilder.add_view() 生成菜單視圖
appbulier.add_view_no_menu() 生成沒有菜單的視圖
flask_appbuilder/security/manage.py
def add_permissions_view(self, base_permissions, view_menu):
view_menu_db = self.add_view_menu(view_menu) # 把視圖添加到視圖表中
pass
資源視圖
superset的資源視圖主要是資料庫,資料表
資料庫權限:
sqla.event.listen(Database, 'after_insert', set_perm)
sqla.event.listen(Database, 'after_update', set_perm)
def get_perm(self):
return (
'[{obj.database_name}].(id:{obj.id})').format(obj=self)
sqlalchemy設定了插入和更新的監聽事件,當這些時間發生的時候,就會把改資源對應的視圖插入到資料表中。可以看到資料庫的視圖是由資料庫的名字和它的ID組成的
資料表權限:
sa.event.listen(SqlaTable, 'after_insert', set_perm)
sa.event.listen(SqlaTable, 'after_update', set_perm)
def get_perm(self):
return (
'[{obj.database}].[{obj.table_name}]'
'(id:{obj.id})').format(obj=self)
表資源視圖的插入和資料庫資源視圖的插入機制一樣,隻是視圖不一樣,表資源的視圖是由資料庫的名字,表的名字和表的ID組成