我在数据库中有一些与不同供应商相关的信息,我希望允许每个注册供应商(代表人)查看仅包含与其相关的数据的切片/仪表板。 一种可能的解决方案可能是为每个供应商创建单独的视图以及为每个供应商创建单独的角色。但如果您有100多家供应商(我的情况就是这样),那感觉就像一个坏主意;它不是一个灵活或可扩展的解决方案。 有没有办法自动过滤每个用户的给定视图?例如,我们有一个“按产品划分的一般利润”条形图,而用户X只能看到供应商X的产品
答案 0 :(得分:1)
您正在寻找的是多租户支持,目前Superset尚未开箱即用。
然而,对于一种可能的解决方案,有一个公开的PR:https://github.com/apache/incubator-superset/pull/3729
一种选择可能是为您的用例重用和/或调整该代码。
另一种选择可能是查看JINJA_CONTEXT_ADDONS
[https://github.com/apache/incubator-superset/blob/master/docs/installation.rst#sql-lab]并查看您是否可以将其他上下文传递给查询(例如您的vendor_id)并使用该参数限制查询范围。
答案 1 :(得分:0)
Superset配置具有以下两种配置(DB_CONNECTION_MUTATOR,SQL_QUERY_MUTATOR),它们可以在一定程度上允许多租户。
一个可调用的,允许更改数据库连接的URL和参数 在运行中即时运行。这样就可以进行模拟或 任意逻辑。例如,您可以将不同的用户连接到 使用不同的连接参数,或将其电子邮件地址作为 用户名。函数接收连接uri对象,连接 params,用户名,并返回突变的uri和params对象。 示例:
def DB_CONNECTION_MUTATOR(uri, params, username, security_manager, source):
user = security_manager.find_user(username=username)
if user and user.email:
uri.username = user.email
return uri, params
请注意,返回的uri和params直接传递给sqlalchemy的
这样的create_engine(url, **params)
DB_CONNECTION_MUTATOR = None
截获要执行的SQL并可以对其进行更改的函数。 用例可以是围绕添加某种注释标题 包含用户名和工作节点信息之类的信息
def SQL_QUERY_MUTATOR(sql, username, security_manager):
dttm = datetime.now().isoformat()
return f"-- [SQL LAB] {username} {dttm}\n{sql}"
SQL_QUERY_MUTATOR = None
答案 2 :(得分:0)
解决此问题的一种简单方法是使用预定义的 JINJA 参数。 可以使用的两个参数是 '{{current_username() }}' 和 {{current_user_id() }}
首先你需要确保你可以使用JINJA模板—— 在 superset_config.py 中添加以下内容
FEATURE_FLAGS = {
"ENABLE_TEMPLATE_PROCESSING": True,
}
重启
现在,如果您转到 SQL LAB 并键入以下内容 -
SELECT '{{ current_username() }}',{{ current_user_id() }};
你应该得到一个输出
?列? | ?列?__1 |
---|---|
支付宝 | 5 |
现在您要做的就是在所有查询中附加以下两个 sql 片段之一。
select ........ from ...... where ...... vendorid={{ current_user_id() }}
select ........ from ...... where ...... vendorname='{{ current_username() }}'
vendorid={{ current_user_id() }} 和/或 vendorname='{{ current_username() }}' 将限制用户只能查看她的数据。
您还可以通过创建一个具有用户到 vendorid 映射的表来使其更加灵活。您可以将该表添加到所有查询中,并且您可以将多个供应商映射到单个用户,甚至将所有供应商映射到超级管理员的单个用户。