Grafana仪表板嵌入实战:5种解决iframe跨域登录问题的方案对比

通过iFrame嵌入Grafana页面或pannel grafana具体Dashboard页面,右上角分享按钮点开有链接,拷贝后作为iframe的url。或者可以通过快照导入,生成本地快照,拷贝快照链接,作为ifame的url即可。针对具体pannel,其嵌入其他页面的链接可在其自己组件的分享界面获取。 阅读详情

Grafana仪表板无缝集成:五种跨域嵌入方案的深度剖析与实战指南

你是否曾尝试将Grafana仪表板嵌入到自己的业务系统中,却发现iframe里要么显示拒绝访问,要么跳转后依然要求登录?这几乎是每个需要集成监控系统的开发者都会遇到的经典难题。上周,我们团队在重构内部运维平台时就卡在了这个环节——用户在主系统登录后,点击监控模块却要重新输入Grafana的账号密码,体验割裂不说,还增加了维护成本。

实际上,Grafana的嵌入需求在金融、物联网、企业级SaaS等场景中越来越普遍。产品经理希望用户在一个界面完成所有操作,而技术团队则需要平衡安全性、用户体验和开发成本。原始文章提到的几种方案各有适用场景,但缺乏系统性的对比和实战细节。今天,我将结合我们踩过的坑和最终落地的方案,为你详细拆解五种主流方案的实现逻辑、适用场景和隐藏陷阱。

这篇文章面向的是需要在自有系统中集成Grafana仪表板的开发者和架构师。无论你是想为内部团队提供统一的监控入口,还是为客户构建一体化的数据可视化平台,这里的内容都能帮你做出更明智的技术选型。我会避免单纯的理论罗列,而是用实际代码、配置示例和性能数据说话,让你看完就能动手实施。

1. 理解核心问题:为什么简单的iframe嵌入会失败?

在深入解决方案之前,我们得先搞清楚Grafana的防护机制是如何工作的。很多人以为只要拿到仪表板的URL,往iframe里一塞就完事了,结果浏览器控制台立刻抛出那个经典的错误:

Refused to display 'http://your-grafana:3000/' in a frame because it set 'X-Frame-Options' to 'deny'

这个错误背后其实是三层防护机制在起作用:

第一层:X-Frame-Options与Content-Security-Policy Grafana默认配置会设置X-Frame-Options: deny,这是HTTP响应头中的一个指令,明确告诉浏览器“不允许在frame中加载此页面”。现代浏览器还会检查Content-Security-Policy头中的frame-ancestors指令,这提供了更细粒度的控制。

第二层:会话与认证状态隔离 即使你通过修改配置绕过了第一层防护,iframe加载的Grafana页面仍然处于独立的会话上下文中。主系统的登录状态(比如存储在cookie中的JWT)对Grafana服务完全不可见,因为浏览器遵循同源策略,不会将主域下的cookie自动发送到iframe中的不同域。

第三层:组织与权限上下文 Grafana支持多租户(组织)架构,每个仪表板都归属于特定的组织。即使认证通过,用户还需要有对应组织的访问权限。原始URL中的orgId参数就是关键,如果用户会话中的组织ID与URL参数不匹配,Grafana会拒绝访问或要求切换组织。

提示:这三个层次的问题必须按顺序解决。只处理X-Frame-Options就像只拆除了围墙的第一道栅栏,后面还有认证和权限两道门等着你。

那么,Grafana为什么要设置这些障碍?主要是出于安全考虑:

  • 点击劫持防护:防止恶意网站将Grafana界面嵌入到透明iframe中,诱导用户进行非预期操作
  • 会话隔离:避免不同系统间的认证信息泄露
  • 资源控制:确保只有授权用户能访问特定的仪表板和数据源

理解了这些,我们就能明白为什么简单的嵌入行不通,以及后续方案需要解决哪些具体问题。

2. 方案一:匿名访问与白名单控制(最简方案)

这是最直接的解决方案,适合对安全性要求不高、或者仪表板内容完全公开的场景。核心思路是关闭Grafana的认证要求,同时通过白名单限制可嵌入的源站点。

2.1 配置步骤详解

首先,你需要修改Grafana的配置文件(通常是/etc/grafana/grafana.ini或通过环境变量设置):

# 允许iframe嵌入
[security]
allow_embedding = true

# 开启匿名访问
[auth.anonymous]
enabled = true
# 匿名用户所属组织(默认为1)
org_name = Main Org.
# 匿名用户的角色(Viewer、Editor或Admin)
org_role = Viewer

# 可选:限制可嵌入的源站点
[security]
content_security_policy = true
content_security_policy_template = "frame-ancestors 'self' https://your-domain.com;"

修改后重启Grafana服务:

# 使用systemd的系统
sudo systemctl restart grafana-server

# 或者直接重启容器(如果使用Docker)
docker restart grafana-container

2.2 前端嵌入代码示例

配置完成后,前端嵌入变得非常简单:

<!DOCTYPE html>
<html>
<head>
    <title>业务系统 - 监控面板</title>
    <style>
        .dashboard-container {
            width: 100%;
            height: 800px;
            border: 1px solid #ddd;
            border-radius: 8px;
            overflow: hidden;
        }
        iframe {
            width: 100%;
            height: 100%;
            border: none;
        }
    </style>
</head>
<body>
    <div class="dashboard-container">
        <iframe 
            src="http://your-grafana:3000/d/your-dashboard-uid?orgId=1&kiosk"
            title="业务监控仪表板"
            allowfullscreen>
        </iframe>
    </div>
</body>
</html>

注意URL中的几个关键参数:

  • orgId=1:指定组织ID,必须与匿名用户配置的组织一致
  • kiosk:隐藏Grafana的顶部和侧边栏,提供更沉浸的查看体验
  • from和to:可以添加时间范围参数,如&from=now-6h&to=now

2.3 安全性增强措施

虽然匿名访问很方便,但完全开放的仪表板显然存在风险。以下是几种增强安全性的方法:

IP白名单限制 在Grafana前部署Nginx,通过allow和deny指令限制访问来源:

server {
    listen 3000;
    server_name your-grafana;
    
    location / {
        # 只允许特定IP段访问
        allow 192.168.1.0/24;
        allow 10.0.0.0/8;
        deny all;
        
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

基于Referer的验证 虽然Referer可以被伪造,但结合其他措施仍有一定效果:

location / {
    # 检查Referer,只允许来自业务系统的嵌入
    if ($http_referer !~* ^https://your-business-domain.com/) {
        return 403;
    }
    
    proxy_pass http://localhost:3000;
}

仪表板权限隔离 即使开启匿名访问,也可以通过Grafana的文件夹权限控制不同仪表板的可见性:

文件夹名称 匿名访问权限 适用场景
public-dashboards 允许查看 公开的业务指标
internal-metrics 禁止访问 内部系统监控
customer-views 条件访问 客户专属视图

2.4 优缺点分析

优点:

  • 实现简单,配置改动最小
  • 无需额外的认证逻辑开发
  • 性能最佳,没有认证开销

缺点:

  • 安全性最低,仪表板内容可能被未授权访问
  • 无法实现个性化视图(所有用户看到相同内容)
  • 无法记录操作审计日志(所有操作都归于匿名用户)

适用场景:

  • 内部团队的开发/测试环境监控
  • 完全公开的数据展示(如公共数据大屏)
  • 临时性的演示或汇报场景

注意:生产环境使用此方案时,务必结合网络层防护(如VPN、内网隔离)和严格的访问日志监控。

3. 方案二:OAuth2/OpenID Connect统一认证

对于需要严格权限控制的企业级应用,OAuth2或OpenID Connect(OIDC)是最标准的解决方案。Grafana原生支持多种OAuth提供商,包括GitHub、GitLab、Google以及通用的OAuth2/OIDC。

3.1 配置Grafana使用OAuth2

以下是以Keycloak(开源身份认证服务器)为例的完整配置:

[auth.generic_oauth]
enabled = true
name = Keycloak
client_id = grafana-client
client_secret = your-client-secret-here
scopes = openid profile email
auth_url = https://keycloak.your-domain.com/auth/realms/master/protocol/openid-connect/auth
token_url = https://keycloak.your-domain.com/auth/realms/master/protocol/openid-connect/token
api_url = https://keycloak.your-domain.com/auth/realms/master/protocol/openid-connect/userinfo
allowed_domains = your-domain.com
allow_sign_up = false
auto_login = false
role_attribute_path = contains(roles[*], 'admin') && 'Admin' || contains(roles[*], 'editor') && 'Editor' || 'Viewer'

关键配置项说明:

  • role_attribute_path:使用JsonPath从OAuth提供商返回的令牌中提取角色信息
  • allowed_domains:限制可登录的邮箱域名
  • auto_login:设置为false,避免自动重定向影响iframe嵌入

3.2 主系统与Grafana的会话同步

OAuth2解决了认证问题,但iframe嵌入时仍然面临会话同步的挑战。以下是两种常见的同步策略:

策略A:主系统统一认证后传递令牌

// 主系统前端代码
async function loadGrafanaDashboard(dashboardUid) {
    // 1. 从主系统获取访问Grafana的临时令牌
    const response = await fetch('/api/grafana/token', {
        credentials: 'include' // 包含主系统的认证cookie
    });
    const { token } = await response.json();
    
    // 2. 构建带有令牌的Grafana URL
    const grafanaUrl = `https://grafana.your-domain.com/d/${dashboardUid}?auth_token=${token}&kiosk`;
    
    // 3. 动态创建iframe
    const iframe = document.createElement('iframe');
    iframe.src = grafanaUrl;
    iframe.style.width = '100%';
    iframe.style.height = '800px';
    iframe.style.border = 'none';
    
    document.getElementById('dashboard-container').appendChild(iframe);
}

策略B:使用PostMessage进行跨域通信

// 主系统页面
const iframe = document.getElementById('grafana-iframe');

// 监听来自iframe的消息
window.addEventListener('message', (event) => {
    // 验证消息来源
    if (event.origin !== 'https://grafana.your-domain.com') return;
    
    if (event.data.type === 'REQUEST_AUTH') {
        // 向Grafana发送认证令牌
        iframe.contentWindow.postMessage({
            type: 'AUTH_TOKEN',
            token: getGrafanaAuthToken()
        }, 'https://grafana.your-domain.com');
    }
});

// Grafana页面内的脚本(通过插件注入)
window.addEventListener('message', (event) => {
    if (event.data.type === 'AUTH_TOKEN') {
        // 使用令牌设置Grafana认证
        localStorage.setItem('grafanaAuthToken', event.data.token);
        window.location.reload(); // 重新加载以应用认证
    }
});

// 页面加载时请求认证
if (parent !== window) {
    parent.postMessage({ type: 'REQUEST_AUTH' }, '*');
}

3.3 角色与权限映射

OAuth2方案的核心优势在于精细的权限控制。以下是一个完整的角色映射示例:

# Grafana配置中的role_attribute_path使用
role_attribute_path = 
  # 如果用户有grafana_admin角色,分配Admin权限
  contains(groups[*], 'grafana_admins') && 'Admin' || 
  # 如果用户有dashboard_editor角色,分配Editor权限  
  contains(groups[*], 'dashboard_editors') && 'Editor' || 
  # 默认分配Viewer权限
  'Viewer'

# 对应的Keycloak客户端配置
keycloak:
  client:
    roles:
      - name: grafana_admins
        description: "Grafana管理员,可以管理所有资源"
      - name: dashboard_editors  
        description: "仪表板编辑者,可以创建和修改仪表板"
      - name: dashboard_viewers
        description: "仪表板查看者,只能查看已有仪表板"

权限映射表:

业务系统角色 Keycloak角色 Grafana权限 可访问的仪表板文件夹
系统管理员 grafana_admins Admin 所有文件夹
运维工程师 dashboard_editors Editor /infra, /applications
开发人员 dashboard_viewers Viewer /applications/team-*
业务人员 dashboard_viewers Viewer /business/metrics

3.4 实施注意事项

令牌有效期管理 OAuth2访问令牌通常有较短的有效期(如1小时),需要处理令牌刷新:

# 后端令牌管理服务示例
class GrafanaTokenManager:
    def __init__(self):
        self.token_cache = {}
    
    def get_valid_token(self, user_id):
        """获取有效的Grafana访问令牌"""
        cached = self.token_cache.get(user_id)
        
        if cached and not self.is_token_expired(cached):
            return cached['access_token']
        
        # 令牌过期或不存在,获取新令牌
        new_token = self.refresh_oauth_token(user_id)
        self.token_cache[user_id] = {
            'access_token': new_token['access_token'],
            'expires_at': time.time() + new_token['expires_in'] - 300  # 提前5分钟过期
        }
        return new_token['access_token']
    
    def refresh_oauth_token(self, user_id):
        """刷新OAuth2令牌"""
        # 这里调用OAuth提供商的令牌刷新接口
        # 或者使用主系统的刷新令牌流程
        pass

使用iframe内嵌grafana监控页面 使用iframe内嵌grafana监控页面,制作监控大盘 阅读详情

相关推荐

解决 iframe 嵌入 grafana 问题

grafana 所有配置参考官网https://grafana.com/docs/grafana/latest/administration/configuration/ 一、添加仪表盘 首先启动 grafana 添加一个仪表盘,为了测试简单我是用的 grafana 自带的 二、test.html 测试 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>grafanna&lt

不懂一休 2万+

自主系统通过iframe 嵌入 grafana 仪表板(dashboard)

使用iframe方式嵌入dashboard主要会遇到以下几个问题:1、iframe方式嵌入dashboard跳转拒绝访问;2、浏览器控制台报错:Refused to display 'http://{ip:port}/' in a frame because it set 'X-Frame-Options' to 'deny';3、跳转之后依然需要登录;......以上有些问题,可以通过修改配置文件相关配置来解决(修改配置文件之后,记得重启grafana服务)

manba_24的专栏 2753

Grafana仪表板iframe嵌入实战:解决X-Frame-Options拒绝访问的5种方法

本文针对Grafana仪表板iframe嵌入时遇到的X-Frame-Options拒绝访问问题,提供了五种实战解决方案。从修改Grafana配置、使用反向代理移除安全头,到通过API Key后端渲染、集成OAuth2单点登录以及后端代理登录转发Cookie,详细阐述了每种方法的原理、配置步骤、优缺点及适用场景,帮助开发者根据安全与集成需求选择最合适的嵌入策略。

5b6n7m8的博客 234

Power BI API生产级实战:从认证配置到嵌入管理全链路指南

Power BI API是企业BI资产自动化编排的核心基础设施,其本质并非简单接口调用,而是基于Azure AD身份认证、细粒度权限控制与异步任务管理的RESTful服务体系。理解其OAuth2.0应用权限模型(Application Permissions)、v1.0稳定版接口契约及Embed Token动态签发机制,是实现报表自动刷新、工作区批量治理与安全嵌入的前提。该技术广泛应用于金融风控日报自动化、制造多租户数据隔离、零售BI SaaS平台集成等场景,支撑CI/CD驱动的BI运维现代化。本文聚焦真实

weixin_33737134的博客 480

基于树莓派打造智能家居显示终端:从硬件组装到Google Assistant集成

智能家居的核心在于构建一个互联互通、可定制化的家庭信息与控制中枢。其技术原理通常围绕嵌入式系统、物联网协议与云端服务交互展开,通过整合硬件感知、数据处理与用户界面,实现环境监测、设备控制与信息展示。在工程实践中,利用开源硬件平台(如树莓派)结合成熟的软件生态,能够高效搭建高度定制化的解决方案,这对于理解嵌入式开发与家庭自动化集成具有重要价值。典型的应用场景包括家庭信息看板、语音控制中枢及环境监控终端。本文以**SmartDisplayPi**项目为例,详细阐述了如何利用**Raspberry Pi**与官方

weixin_33690367的博客 190

【信息科学与工程学】计算机科学与自动化 第二百零一十一 软件开发模型01

编号类型模型领域模型中的知识点/因素/参数关联知识和法律法规1传统顺序模型瀑布模型 (Waterfall)通用软件开发、硬件紧密耦合系统、政府/军工项目、需求稳定的传统信息系统严格线性阶段:可行性研究→需求分析(SRS,含功能/非功能/接口/约束,使用IEEE 830模板)→系统设计(概要设计HLD:架构、模块划分、数据库ER图;详细设计LLD:伪代码、类图、接口定义)→实现(编码规范、代码审查、静态分析工具SonarQube)→测试(单元测试JUnit、集成测试、系统测试、验收测试UAT,测试计划提前编写

weixin_49199313的博客 167

Grafana嵌入iframe,websoket连接报错400或403(nginx代理)

1、custom.ini配置文件修改allowed_origins=*

一个行走江湖的人 2132

Grafana集成到自己的Web项目1

Grafana集成到自己的Web项目Web项目中我使用iframe直接嵌套进去的但是浏览器缓存清除了或者session失效了,每次进入Web页面看Grafana

从零搭建 AI 运维 Agent:告警自动诊断 + 修复的完整技术方案

适合读者:管理 5-50 台服务器的运维/SRE 工程师、技术负责人 技术栈:FastAPI + React + PostgreSQL + Redis + DeepSeek 关键词:AI运维、AIOps、自动化运维、智能告警、告警修复、Runbook自动化、DevOps、SRE、DeepSeek运维

weixin_38359457的博客 1640

Ansys Maxwell磁场仿真入门:无线传能线圈自感与互感计算全流程

本文详细介绍了使用Ansys Maxwell进行无线充电线圈磁场仿真的全流程,包括模型建立、求解器设置、电感参数提取及优化策略。通过实战案例,帮助工程师掌握线圈自感与互感计算技巧,提升无线充电系统设计效率与精度。重点解析了Maxwell在磁场仿真中的关键应用,适用于电磁场仿真初学者和进阶用户。

weixin_29047545的博客 443

Mooncake架构:基于KVCache解耦的LLM推理优化方案

在大语言模型推理中,KVCache是Transformer解码过程中用于缓存历史Key/Value向量的核心数据结构,它避免了序列重复计算,但会随上下文长度线性增长,成为显存占用的主要部分。其原理是在自回归生成时,将已计算过的注意力键值对存储下来,供后续Token生成时直接使用,从而提升计算效率。这项技术的核心价值在于,通过高效管理KVCache,可以显著降低长序列推理时的显存压力,提升GPU资源利用率。在实际应用场景中,尤其是在处理长上下文对话、高并发请求时,KVCache的管理策略直接决定了服务的吞吐量

weixin_35753431的博客 536

解密携程风控:user-dun算法中的自定义base64与多模式加密机制剖析

本文深入剖析了携程旅行APP风控核心组件libduncode.so中的user-dun算法。文章重点解密了其采用的自定义Base64编码机制与多模式加密选择逻辑,并详细阐述了如何通过动态分析与静态还原,理解算法与设备指纹的深度绑定关系,为逆向分析类似混淆加固的风控算法提供了系统的方法论。

weixin_29323049的博客 340

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1598

BitLocker加密盘解密实战:从隐藏分区到密钥恢复的全过程

本文深入探讨了BitLocker加密盘在密钥丢失或遗忘情况下的解密实战方法。文章系统性地介绍了从理解加密机制、制作取证镜像,到深度扫描隐藏分区、分析内存转储寻找密钥残留,最终利用恢复密钥解锁加密卷的全过程。重点剖析了非标准恢复路径,为数据恢复和数字取证工作提供了专业的技术框架和实战思路。

weixin_29268385的博客 338

国产SR8201F以太网PHY芯片调试避坑指南:从机贴失败到杜邦线救场的实战记录

本文详细介绍了国产SR8201F以太网PHY芯片的调试避坑指南,涵盖硬件设计、PCB布局、SMT贴片及软件驱动等关键环节。通过实战案例解析,帮助工程师解决MII/RMII接口配置、电源设计、信号完整性等典型问题,提升以太网通信稳定性与EMC性能。

c6d7e8f9g的博客 1217

YOLOv11改进策略【损失函数篇】| 通过辅助边界框计算IoU提升检测效果(Inner_GIoU、Inner_DIoU、Inner_CIoU、Inner_EIoU、Inner_SIoU)

为了弥补现有 IoU 损失在不同检测任务中泛化性弱和收敛速度慢的问题,·Inner-IoU·通过引入比例因子 “ratio” 来控制辅助边界框的尺度大小,利用不同尺度的辅助边界框来计算损失,从而加速边界框回归过程。

Limiiiing的博客 3893

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 医学图像分割评测:5个关键指标代码实现与避坑指南(含Dice/ASSD/HD95)
下一篇: 如何用Nginx+Docker快速部署你的私人单词库(附COCA20000实战配置)
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值