如何为Superset新发布仪表盘自动分配Gamma默认角色
实现Superset新仪表盘自动分配Gamma角色
针对你启用DASHBOARD_RBAC后需要自动为新发布仪表盘分配Gamma角色的需求,可通过以下两种方案实现:
方案一:SQLAlchemy事件监听
利用SQLAlchemy的after_insert事件,在新仪表盘创建完成后自动关联Gamma角色,无需修改原模型逻辑。
实现步骤
- 在Superset的自定义代码目录(如
superset/custom)下创建auto_assign_role.py文件:
from sqlalchemy import event from superset.models.dashboard import Dashboard from superset.models.roles import Role from superset import db def assign_gamma_on_dashboard_create(mapper, connection, target): # 查找Gamma角色 gamma_role = db.session.query(Role).filter(Role.name == "Gamma").first() if gamma_role and target not in gamma_role.dashboards: gamma_role.dashboards.append(target) db.session.commit() # 为Dashboard模型绑定插入后事件 event.listen(Dashboard, 'after_insert', assign_gamma_on_dashboard_create)
- 在Superset的配置文件
superset_config.py末尾添加导入语句,确保服务启动时加载该逻辑:
import superset.custom.auto_assign_role
方案二:重写Dashboard的save方法
若需要仅对已发布的仪表盘执行角色分配,可重写Dashboard模型的save方法,增加状态判断逻辑。
实现步骤
- 在自定义目录下创建
custom_dashboard.py文件:
from superset.models.dashboard import Dashboard as BaseDashboard from superset.models.roles import Role from superset import db class Dashboard(BaseDashboard): __tablename__ = "dashboards" # 复用原数据库表 def save(self, session=None): # 执行原save逻辑 super().save(session) session = session or db.session # 仅当仪表盘标记为发布时分配Gamma角色 if self.published: gamma_role = session.query(Role).filter(Role.name == "Gamma").first() if gamma_role and self not in gamma_role.dashboards: gamma_role.dashboards.append(self) session.commit() # 替换原Dashboard模型 from superset.models import dashboard dashboard.Dashboard = Dashboard
- 在
superset_config.py中导入自定义模型:
import superset.custom.custom_dashboard
补充说明
- 确保Superset中已存在Gamma角色,若未创建可通过界面或CLI命令
superset create-role -n Gamma生成。 - 修改代码后需重启Superset服务,使自定义逻辑生效。
- 若需为已存在的发布仪表盘批量分配角色,可通过Superset Shell执行以下脚本:
from superset import db from superset.models.dashboard import Dashboard from superset.models.roles import Role gamma_role = db.session.query(Role).filter(Role.name == "Gamma").first() if gamma_role: published_dashboards = db.session.query(Dashboard).filter(Dashboard.published == True).all() for dash in published_dashboards: if dash not in gamma_role.dashboards: gamma_role.dashboards.append(dash) db.session.commit()
内容的提问来源于stack exchange,提问作者kalyan4uonly
相关产品推荐
相关产品推荐

