如何通过Superset Embed SDK传递参数至Jinja SQL查询?
实现方案
方式一:通过URL参数传递(简单直接)
在Superset Embed SDK的embedDashboard配置中添加urlParams字段,直接传入hashed_team_id参数:
supersetEmbeddedSdk.embedDashboard({ id: '<my-dashboard-id>', supersetDomain: 'http://<my-url>:8088', mountPoint: document.getElementById('container'), fetchGuestToken: () => '<guest-token>', // 新增URL参数配置 urlParams: { hashed_team_id: '{{ auth()->user()->currentTeam->hashed_team_id }}' } })
之后在Superset数据集的SQL查询中,通过{{ url_param('hashed_team_id') }}获取该参数:
SELECT * from example WHERE 1=1 AND teams.hashed_team_id = '{{ url_param('hashed_team_id') }}'
注意:这种方式参数会暴露在嵌入页面的URL中,适合非敏感场景使用。
方式二:通过Guest Token上下文传递(安全隐蔽)
如果hashed_team_id属于敏感数据,建议通过Guest Token的上下文传递,避免参数暴露:
1. Laravel后端生成带上下文的Guest Token
修改后端的Guest Token生成逻辑,在请求Superset的Guest Token接口时,添加user_context字段携带参数:
// Laravel后端生成Guest Token示例 use GuzzleHttp\Client; $client = new Client(); $response = $client->post('http://<my-url>:8088/api/v1/security/guest_token/', [ 'headers' => [ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . env('SUPERSET_ADMIN_API_TOKEN'), ], 'json' => [ 'user' => [ 'username' => 'embedded-team-user', 'first_name' => 'Embedded', 'last_name' => 'TeamUser', ], 'resources' => [ [ 'type' => 'dashboard', 'id' => '<my-dashboard-id>', ], ], 'rls' => [], // 携带团队ID到用户上下文 'user_context' => [ 'hashed_team_id' => auth()->user()->currentTeam->hashed_team_id, ], ], ]); $guestToken = json_decode($response->getBody())->token;
2. 前端从后端获取带上下文的Token
修改前端的fetchGuestToken逻辑,改为请求自己的Laravel接口获取生成好的Token:
supersetEmbeddedSdk.embedDashboard({ id: '<my-dashboard-id>', supersetDomain: 'http://<my-url>:8088', mountPoint: document.getElementById('container'), fetchGuestToken: async () => { const res = await fetch('/api/superset/get-guest-token'); const data = await res.json(); return data.token; } })
3. Superset SQL中读取上下文参数
在数据集的SQL查询中,通过current_user_context获取参数:
SELECT * from example WHERE 1=1 AND teams.hashed_team_id = '{{ current_user_context.get('hashed_team_id') }}'
内容的提问来源于stack exchange,提问作者xslibx
相关产品推荐
相关产品推荐

