Metabase Guest Embedding 完全指南:无 SSO 的 JWT 嵌入式仪表板与问题嵌入实战
【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase
Guest Embedding(访客嵌入)是 Metabase 提供的一种嵌入式认证方案:你无需为每个查看图表/仪表板的访客创建 Metabase 账号,只需在自己的应用服务端用共享密钥签发 JWT,即可把问题(Question)、仪表板(Dashboard)以 Web Component 的形式嵌入到你的网站中。本文基于当前仓库的官方文档与源码,完整讲解从开启功能、生成嵌入代码、配置三类参数(Disabled / Editable / Locked),到 JWT 刷新端点(guestEmbedProviderUri)、锁定参数进阶用法与安全运维的方方面面,读完即可在自托管或商业版 Metabase 上落地一套不依赖 SSO 的嵌入式分析方案。
认识 Guest Embed:认证方式与数据新鲜度
"Guest(访客)"指的是认证方式:Metabase不会为每个查看嵌入内容的人创建会话。它有两层关键含义:
- 认证与数据新鲜度无关:Guest Embed 中的仪表板与图表始终展示数据库中的实时数据,不存在快照或缓存副本;
- 不使用 SSO 依然安全:Metabase 只有在请求携带一个使用你与 Metabase 共享的密钥签名过的 JWT时才会加载嵌入内容。JWT 中除了签名本身,还包含要加载资源的引用(如嵌入项 ID)以及任意参数值。
如果要针对特定人群或分组限制 Guest Embed 中的数据,官方推荐使用 锁定参数(Locked Parameters) 机制(详见下文)。
从源码结构看,Metabase 的嵌入体系由多个模块协同:metabase.embedding.settings(嵌入相关设置)、metabase.embedding.jwt(JWT 解析与验签)、metabase.embedding-rest.api.embed(/api/embed/*端点)以及前端 SDK 目录 frontend/src/metabase/embedding/embedding-iframe-sdk。本文涉及的所有行为都对应着这些模块中的真实实现。
在 Metabase 中开启 Guest Embedding
开启入口因 Metabase 版本/版本类型而异:
- OSS(开源版):Admin(管理设置)> Embedding
- Starter / Pro / Enterprise:Admin > Embedding > Guest embeds
在页面中打开Enable guest embeds开关即可。这一开关在源码中对应enable-embedding-simple设置(见 src/metabase/embedding/settings.clj)。值得注意的底层细节:
- 开启后,如果
embedding-secret-key尚为空,Metabase 会自动调用secure-hex 32生成一个 256-bit 的随机密钥; - 开关状态变化会通过 Snowplow 记录
embed_share事件,并统计当前已嵌入的问题数与仪表板数; - 该开关支持通过环境变量
MB_ENABLE_EMBEDDING_SIMPLE配置(从 0.51.0 起旧的MB_ENABLE_EMBEDDING已废弃,同时设置新旧变量会在启动时报错)。
创建 Guest Embed 的完整流程
Metabase 提供了一个可视化向导(Embedding 向导)来生成可用的嵌入代码。官方文档给出的操作步骤如下:
- 打开你想要嵌入到网站中的对象(问题或仪表板)。你也可以按
Ctrl/Cmd + K打开命令面板,输入 "New embed" 快速进入; - 点击Share(分享)图标;
- 选择Embed;
- 在Authentication(认证方式)下选择Guest;
- (可选)定制嵌入的外观;
- (可选)设置每个参数的可见性;
- 点击Publish(发布);
- 复制向导生成的代码片段,添加到你的应用中。
向导生成的代码分为客户端与服务端两部分,下面逐一拆解。
向导生成代码详解:客户端与服务端
客户端代码:加载脚本与 Web Component
在你的 HTML 中引入嵌入脚本并配置全局配置对象:
<script defer src="YOUR_METABASE_URL/app/embed.js"></script> <script> window.metabaseConfig = { isGuest: true, instanceUrl: "YOUR_METABASE_URL", // Optional. Set this if you want the embed to fetch a fresh JWT // when the current one expires. See "Refreshing the JWT" below. // guestEmbedProviderUri: "/your/apps/endpoint", }; </script>然后为要嵌入的对象添加对应的 Web Component:
<!-- For dashboards --> <metabase-dashboard token="YOUR_JWT_TOKEN" with-title="true" with-downloads="false" initial-parameters='{"category":["Gizmo"]}' ></metabase-dashboard> <!-- For questions --> <metabase-question token="YOUR_JWT_TOKEN"></metabase-question>重要安全提醒:不要把写死的 JWT 留在 HTML 里。Token 会过期,嵌入随后就会失效。正确的做法有两种:要么在你的服务端为每次页面加载签署一个新鲜 Token 并渲染进
token属性;要么配置guestEmbedProviderUri让嵌入组件自己获取并刷新 Token。
服务端代码:签名 JWT(Node.js 示例)
你的服务器负责生成已签名的 JWT 来认证嵌入请求。官方文档给出的 Node.js 示例:
const jwt = require("jsonwebtoken"); const METABASE_SECRET_KEY = "YOUR_METABASE_SECRET_KEY"; const payload = { resource: { dashboard: 10 }, // or { question: 5 } for questions params: {}, exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration }; const token = jwt.sign(payload, METABASE_SECRET_KEY);把YOUR_METABASE_SECRET_KEY替换成你的 embedding secret key。示例中使用的是顺序 ID(即对象 URL 中的数字);在 Pro 和 Enterprise 版本中,你也可以使用 实体 ID(Entity IDs),它在从一个 Metabase 序列化到另一个(例如从 staging 到 production)时保持不变。
关于密钥的格式,源码 src/metabase/embedding/settings.clj 中给出了硬性校验:secret key 必须是十六进制编码的 256-bit 密钥,即一个 64 字符的字符串,否则设置会被拒绝(报错信息原文:Invalid embedding-secret-key! Secret key must be a hexadecimal-encoded 256-bit key (i.e., a 64-character string).)。此外该密钥在数据库中的存储采用:when-encryption-key-set加密策略,仅管理员可见,且不会出现在审计日志的值里。
组件属性参考
你可以通过设置不同属性来开启/关闭 UI 能力。常用属性如下:
| 属性 | 说明 |
|---|---|
token | 必填。来自你服务端的已签名 JWT。 |
with-title | 显示或隐藏标题。取值:"true"或"false"。 |
with-downloads* | 启用或禁用下载。取值:"true"或"false"。 |
initial-parameters | 初始参数值的 JSON 字符串(非受控)。示例:'{"category":["Gizmo"]}'。详见 Modular embedding 参数。 |
parameters | 参数值的 JSON 字符串(受控)。示例:'{"category":["Gizmo"]}'。详见 Modular embedding 参数。 |
auto-refresh-interval | 仅仪表板。自动刷新间隔(秒)。 |
custom-context | 转发给你的guestEmbedProviderUri端点,作为customContext字段。可以是字符串(如"gadgets-tab"),也可以是像initial-parameters那样的 JSON 字符串化对象(如'{"tab":"gadgets","region":"us-east"}')。 |
* 禁用下载仅在 Pro 与 Enterprise 版本可用。
不同嵌入对象可用的属性不同:Guest Embed 的选项比 SSO 嵌入更少。完整属性清单请参考 仪表板组件参考 与 问题组件参考。
定制 Guest Embed 的外观
Guest Embed 可用的外观设置取决于你的 Metabase 版本:OSS/Starter 只能选择浅色或深色主题;Pro/Enterprise 则提供细粒度定制选项(字体、色彩、Logo 等),详见 Appearance(外观)。
配置参数:Disabled / Editable / Locked
参数默认是Disabled状态,此时对最终用户完全隐藏且不可设置。你可以把每个参数配置为三种状态之一:
- Disabled(禁用):对最终用户隐藏,不可设置。这是默认值;
- Editable(可编辑):最终用户可以看到并修改参数值;
- Locked(锁定):对最终用户隐藏,由你的服务器(而非最终用户)通过 JWT 设置。
配置参数的步骤:
- 打开你要嵌入的问题或仪表板;
- 点击Share图标,选择Embed;
- 在Parameters(参数)下为每个参数选择可见性选项,并可选设置默认值;
- 点击Publish。
这一设计在服务端对应embedding_params(即:embedding_params)字段。源码 src/metabase/embedding_rest/api/common.clj 的check-params-are-allowed函数完整实现了三种状态的校验逻辑:
disabled:JWT 和 URL 查询参数都不允许携带该参数,否则返回400 You're not allowed to specify a value for <param>.;enabled:JWT或URL 可指定,但两者不能同时出现,否则返回400 You can't specify a value for <param> if it's already set in the JWT.;locked:JWT必须包含该参数(否则报You must specify a value for <param> in the JWT.),且 URL 中不允许再指定。
Editable(可编辑)参数
设置为 Editable 后,你可以为过滤器设置默认值,但用户在查看问题或仪表板时可以修改这些值。
服务端代码:传入空的params对象即可:
// you will need to install via 'npm install jsonwebtoken' or in your package.json const jwt = require("jsonwebtoken"); const METABASE_SECRET_KEY = "YOUR_METABASE_SECRET_KEY"; const payload = { resource: { dashboard: 10 }, params: {}, exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration }; const token = jwt.sign(payload, METABASE_SECRET_KEY);客户端代码:用initial-parameters在客户端设置默认参数:
<script defer src="YOUR_METABASE_URL/app/embed.js"></script> <script> function defineMetabaseConfig(config) { window.metabaseConfig = config; } </script> <script> defineMetabaseConfig({ isGuest: true, instanceUrl: "YOUR_METABASE_URL", }); </script> <!-- This token is a placeholder. Don't paste a fixed JWT into your HTML: sign a fresh one on your server for each page load, or use guestEmbedProviderUri. --> <metabase-dashboard token="YOUR SIGNED TOKEN" with-title="true" with-downloads="false" initial-parameters='{"category":["Doohickey","Gizmo"]}' > </metabase-dashboard>受控参数(parameters属性)的文档见 Modular embedding 参数。
Locked(锁定)参数
锁定参数让你在不把过滤器暴露给最终用户的前提下过滤数据。它非常适合按观看者身份限制数据——例如让每个客户只能看到自己的数据。
使用锁定参数需要三步:
- 在嵌入设置中把参数设为Locked;
- 在服务端把参数值写进 JWT;
- 发布(Publish)该对象。
下面是锁定category参数时 Metabase 生成的示例代码。
服务端代码(Node.js)——在服务端设置锁定参数,将其放进 token:
// Install via 'npm install jsonwebtoken' const jwt = require("jsonwebtoken"); const METABASE_SECRET_KEY = "YOUR_METABASE_SECRET_KEY"; const payload = { resource: { dashboard: 10 }, params: { category: ["Gadget"], // Set the locked parameter value to Gadget }, exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration }; const token = jwt.sign(payload, METABASE_SECRET_KEY);客户端代码(HTML)——参数完全由 JWT 决定:
<script defer src="YOUR_METABASE_URL/app/embed.js"></script> <script> window.metabaseConfig = { isGuest: true, // Must be set to guest instanceUrl: "YOUR_METABASE_URL", }; </script> <!-- This token is a placeholder. Don't paste a fixed JWT into your HTML: sign a fresh one on your server for each page load, or use guestEmbedProviderUri. --> <metabase-dashboard token="YOUR_JWT_TOKEN" with-title="true" with-downloads="false" ></metabase-dashboard>最终用户看不到 "category" 过滤器,但仪表板只会展示 "Gadget" 类别的数据(或你在签名 JWT 的params对象中传给category数组的任何值)。
更新锁定参数的进阶规则
JWT 必须包含所有锁定参数
一旦你发布了带锁定参数的问题或仪表板,签名 JWT 时必须在params对象中包含该锁定参数的名字。如果漏掉,Metabase 会拒绝请求并记录日志:You must specify a value for :<parameter-name> in the JWT。例如锁定参数是category,报错会显示为You must specify a value for :category in the JWT。这条错误信息正对应上文源码中check-params-are-allowed对locked状态的校验((api/check (some? (get token-values param)) [400 (tru "You must specify a value for {0} in the JWT." (keyword param))]))。
传入空数组以关闭锁定参数
如果某个 Token 不希望应用锁定过滤,可以给该参数传空数组[]:
const payload = { resource: { dashboard: 10 }, params: { category: [], // locked filter is bypassed for this token }, exp: Math.round(Date.now() / 1000) + 10 * 60, };这在你想跨上下文复用同一个仪表板/问题、并在某些场景下有条件地跳过锁定过滤器时非常有用。
过滤器名称必须与锁定参数名匹配
如果你重命名了作为锁定参数使用的仪表板过滤器,需要同步更新 JWTparams对象中对应的 key。不过,连接到 SQL 变量 的锁定参数无需在服务端改名。
多个锁定参数 / 多值传递
JWT 中锁定参数的值必须与过滤器值完全一致。设置多个锁定参数、或给单个锁定参数传多个值的最佳实践是:在嵌入向导的Preview locked parameters下挑选一个过滤器值,然后复制 Metabase 生成的对应服务端代码。
多个锁定参数之间按AND组合,而非 OR。如果某个 Token 只想应用其中一部分锁定参数,请给其余参数传[](见上文"传入空数组")。
锁定参数会限制其他可编辑参数的候选值
由于锁定参数会在结果展示之前过滤数据,它同时也会限制同一对象上任何可编辑过滤器部件的候选值。
举例:你嵌入了一个带 State 和 City 两个过滤器的仪表板。如果把 State 锁定为 "Vermont",那么 City 过滤器的下拉框里只会出现 Vermont 的市。你不需要显式地把两个过滤器串联起来——它们会自动表现得像 链接过滤器。
含 SQL 问题的仪表板:锁定参数只能传单一值
如果锁定参数连接的仪表板过滤器,又连接到了仪表板上的SQL 问题,那么你在 JWT 中只能为该锁定参数传单个值。
例如:仪表板过滤器叫 "Breakfast",候选值有 "Hash browns"、"Muffin"、"Waffles",而该过滤器连接了仪表板上任意一个SQL 问题,那么作为锁定参数值时你只能从中选一个传入。
用锁定参数驱动你自建的自定义过滤部件
因为 Metabase 不会渲染锁定参数对应的过滤器部件,你可以用它来驱动自己构建的自定义过滤部件。自建过滤部件的常见动机:
- 让部件与你应用的外观风格保持一致;
- 加入自定义逻辑,比如记住最近使用的值;
- 在应用的不同位置以不同方式复用同一个仪表板。例如一个销售仪表板,在一个位置按 "region" 锁定,在另一个位置按 "team" 锁定。
当最终用户在你的自定义部件中改了值时,在服务端用更新后的params重新签名一个新的 JWT,并替换到 Web Component 的token属性上,嵌入内容就会用新的锁定值重新请求数据。
针对这种流程,建议在组件上预渲染一个初始 Token,而不是让guestEmbedProviderUri提供第一个 Token。因为一个没有 Token 启动的嵌入会在加载时从你的端点获取一个 Token,而这个 Token 会覆盖你的部件刚刚设置的值。
从服务器刷新 / 初始化 JWT:guestEmbedProviderUri
你为 Guest Embed 签发的 JWT 带有过期时间(exp)。一旦过期,嵌入将无法加载新数据,且查看者已做的过滤器选择会在下一次请求时重置。为了让嵌入不刷新页面也能持续工作,可以在你的服务器上配置一个 guest token 端点,按需签发新 JWT。
该端点可服务于两种流程:
- 刷新 Token:当嵌入当前的 JWT 即将过期时,嵌入组件会 POST 到你的端点获取新 JWT 并替换进去;
- 初始化 Token(可选):如果你完全不想在 HTML 中预渲染 JWT,嵌入组件也可以在加载时调用同一端点获取第一个 JWT。
在 guest embed 中设置端点地址
在metabaseConfig中添加guestEmbedProviderUri,值为你应用中一个端点的路径(或完整 URL):
<script> window.metabaseConfig = { isGuest: true, instanceUrl: "YOUR_METABASE_URL", guestEmbedProviderUri: "/api/metabase-guest-token", }; </script>当嵌入需要 Token 时,它会向guestEmbedProviderUri发送一个POST请求,请求体为 JSON,并且会携带 cookie,因此你可以用应用现有的会话体系来认证该请求。
从前端实现看(frontend/src/metabase/embedding/embedding-iframe-sdk/embed.ts),SDK 会在请求 URL 上追加response=json查询参数、使用fetch以POST方式调用该端点,并解析返回中的jwt字段用于初始化或刷新 Token。
请求体格式:
{ "entityType": "dashboard", "entityId": 10, "customContext": "..." }| 字段 | 说明 |
|---|---|
entityType | "dashboard"或"question"。 |
entityId | 正在被嵌入的仪表板或问题的 ID,即你在组件上设置的 ID。 |
customContext | 可选。你在custom-context属性上设置的字符串或对象。 |
响应:一个包含单个jwt字段的 JSON 对象:
{ "jwt": "YOUR_NEWLY_SIGNED_JWT" }刷新流程(Refresh flow)
在组件上预渲染一个初始 JWT(就像普通 Guest Embed 一样),同时配置guestEmbedProviderUri。JWT 过期时,嵌入组件会调用你的端点获取新 Token 并替换。
<script> window.metabaseConfig = { isGuest: true, instanceUrl: "YOUR_METABASE_URL", guestEmbedProviderUri: "/api/metabase-guest-token", }; </script> <metabase-dashboard token="YOUR_INITIAL_JWT"></metabase-dashboard>不在 HTML 中预渲染 JWT 的初始化方式
如果你完全不想在 HTML 里渲染 JWT,可以省略token属性,改用dashboard-id(或question-id)。只要设置了guestEmbedProviderUri,嵌入组件会在加载时调用该端点获取第一个 JWT:
<metabase-dashboard dashboard-id="10"></metabase-dashboard>这样你可以把所有签发 Token 的逻辑统一放在服务器一处。
端点示例(Node.js / Express)
const jwt = require("jsonwebtoken"); const METABASE_SECRET_KEY = "YOUR_METABASE_SECRET_KEY"; app.post("/api/metabase-guest-token", (req, res) => { // Authenticate using your app's existing session. const user = req.session?.user; if (!user) { return res.status(403).json({ error: "Not signed in" }); } const { entityType, entityId, customContext } = req.body; // Authorize the request. The browser picks the entityType and entityId, so // check them against your own rule before signing for them. // This is just an example if (!userCanView(user, entityType, entityId)) { return res.status(403).json({ error: "Not allowed" }); } const payload = { resource: { [entityType]: entityId }, params: paramsFor(user, customContext), exp: Math.round(Date.now() / 1000) + 10 * 60, // 10 minute expiration }; res.json({ jwt: jwt.sign(payload, METABASE_SECRET_KEY) }); });因为嵌入的请求会携带你应用的会话 cookie,你的端点可以:
- 对未登录你应用的访客拒绝签发 JWT(返回
403); - 对某个访客不应看到的仪表板/问题拒绝签发 JWT。注意
entityType与entityId来自浏览器,一个不做校验就签名的端点,会让任何已登录访客都能拿到任意已发布对象的 Token; - 按访客计算不同的
params(即锁定的过滤值)。
发送自定义上下文(custom-context)
当你在同一页面多次嵌入同一个仪表板/问题时,可以用custom-context属性告诉端点正在请求 Token 的是哪一份拷贝。你传入的值会以customContext形式转发到端点。
例如,同一仪表板的两份拷贝分别限定不同类别:
<metabase-dashboard dashboard-id="10" custom-context="gadgets-tab" ></metabase-dashboard>也可以传入 JSON 字符串化的对象(嵌入组件会先解析再转发,因此你的端点收到的是真实对象):
<metabase-dashboard dashboard-id="10" custom-context='{"tab":"gadgets","region":"us-east"}' ></metabase-dashboard>你的端点可以基于customContext设置不同的锁定参数,例如:
function paramsFor(user, customContext) { switch (customContext) { case "gadgets-tab": return { category: ["Gadget"] }; case "doohickeys-tab": return { category: ["Doohickey"] }; default: return {}; } }Guest Embedding 的工作原理与请求链路(源码级)
Guest Embed 使用 Web Component(<metabase-dashboard>与<metabase-question>)与你的 Metabase 实例通信。每次嵌入请求都需要一个用你的 secret key 签名的 JWT。一次完整的访问流程如下:
- 你的服务器生成一个包含资源 ID(仪表板或问题)以及任何锁定参数的签名 JWT;
- Web Component 把 Token 发送给 Metabase;
- Metabase 用你的 secret key 验证 JWT 签名;
- 验证通过后,Metabase 返回嵌入内容;
- 如果你配置了 JWT 刷新,嵌入组件会在当前 Token 过期后、下一次需要发起数据请求时,从你的端点获取新 JWT——不是靠后台定时器。空闲的嵌入不会发起任何刷新请求。(可选地,嵌入组件也可以在加载时从端点获取第一个 JWT。)整个过程无需刷新页面。
从源码层面看,这一链路在 src/metabase/embedding_rest/api/embed.clj 中实现,核心端点包括:
GET /api/embed/card/:token:获取问题(Card)的元数据;GET /api/embed/card/:token/query:执行问题查询并返回结果;GET /api/embed/card/:token/query/:export-format:以指定格式导出查询结果文件;GET /api/embed/dashboard/:token:获取仪表板;GET /api/embed/dashboard/:token/dashcard/:dashcard-id/card/:card-id:执行仪表板中某张卡片所属的查询;- 以及对应的参数候选值、搜索、重映射(remapping)、透视(pivot)与地图瓦片(tiles)等端点。
JWT 的验签逻辑在 src/metabase/embedding/jwt.clj 的unsign函数中:它会先手动解析 JWT 头,拒绝alg为none的 Token(防止未签名伪造),再用embedding-secret-key做签名验证,并允许 60 秒的时钟偏移容差(leeway);任何验签失败都会以400状态返回。另外,translate-token-ids会把 Token 中resource.question/resource.dashboard的实体 ID 翻译成内部card_id/dashboard_id——这正是"实体 ID 在序列化迁移后保持不变"能力的底层支撑。
对于交互式过滤器,你可以通过initial-parameters属性传入初始参数值;当访客更改过滤器时,Web Component 会自动处理更新。
签名 JWT 使用你的 Metabase secret key 生成。secret key 是 Metabase 判断请求可信的依据。请注意:这个密钥在所有 Guest Embed 之间共享,谁拿到了它,就能访问所有已嵌入的对象。
运维与安全管理
禁用某个问题/仪表板的嵌入
- 访问可嵌入的问题或仪表板;
- 点击Share图标(右上角带箭头的方框);
- 选择Embed;
- 选择Guest embedding;
- 点击Unpublish。
管理员可以在Admin > Embedding查看所有已嵌入项的列表(Pro/Enterprise 版本请查看Guest embeds标签页)。
移除 "Powered by Metabase" 横幅
Metabase 会在 OSS 与 Starter 版本的 Guest Embed(图表和仪表板)上添加 "Powered by Metabase" 横幅。要移除它,需要升级到 Pro 或 Enterprise 版本。
重新生成 embedding secret key
你的 embedding secret key 用于为所有嵌入签发 JWT。
- 进入Admin > Embedding(Pro/Enterprise 版本查看Guest embeds标签页);
- 在Regenerate secret key下点击Regenerate key。
该密钥在所有 Guest Embed 之间共享,任何拿到它的人都可能访问所有已嵌入的对象,请务必妥善保管。重新生成后,需要同步更新你服务端代码中的密钥。
其他注意事项
仪表板自定义跳转(Custom destinations)限制
在 Guest Embed 的仪表板中,自定义跳转只能使用URL选项。外部 URL 会在新标签页/新窗口中打开。你可以在外部 URL 中透传过滤器值,除非该过滤器是锁定状态。
翻译嵌入内容
要为嵌入设置界面语言,在window.metabaseConfig中设置locale:
<script> window.metabaseConfig = { isGuest: true, instanceUrl: "YOUR_METABASE_URL", locale: "es", }; </script>locale设置对所有模块化嵌入(Guest、SSO 与 SDK)都生效。Metabase 会自动翻译 UI 元素(如菜单和按钮)。若要同时翻译仪表板标题、过滤器标签等内容,需要上传一份翻译词典。
与 SDK 混合使用
如果你正在使用 Modular Embedding SDK,同时也想用 Guest 认证嵌入问题或仪表板,你仍然需要先在 Metabase 中访问该对象并发布它。可以忽略向导生成的代码,但为了让 Metabase 确认可以对外提供该对象,发布是必须的。
一个限制是:你应用的每个页面只能使用一种认证类型。例如,同一页面不能同时存在一个用 Guest 认证的问题和一个用 SSO 认证的问题。
Guest Embed 的限制清单
因为 Guest Embed 不需要你通过 SSO 为每个人创建 Metabase 账号,Metabase 无法知道正在观看嵌入内容的人是谁,因此也无法为其开放完整的数据访问与全部 Metabase 能力。
Guest Embed 无法使用以下能力:
- 行级与列级权限
- 数据库路由
- 下钻(Drill-through)
- 使用情况分析
- 查询构建器
- AI 对话
- 自定义可视化
如果需要这些能力,请转向 带 SSO 的 Modular embedding。此外,若想在嵌入图表中获得更多交互能力(如下钻与自助查询),同样建议参考 Modular embedding。
进一步阅读
- 嵌入介绍
- 定制 Metabase 的外观
- Modular embedding 参数详解
- 序列化与实体 ID
【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考