You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:37:12