gpt4 book ai didi

php - 如何在我网站的管理面板中安全地显示 grafana 图表?

转载 作者:可可西里 更新时间:2023-11-01 12:38:35 25 4
gpt4 key购买 nike

我在 grafana 中创建了一些不错的图。我想直接在我网站的管理面板中显示其中一些,而不是强制用户转到 grafana 仪表板并强制他们进行双重身份验证(一次用于我的网站,一次用于 grafana)。

一个选项是 enable anonymous access in grafana并使用 grafana 中每个图形可用的共享/嵌入 iframe 选项。虽然它运行良好,但如果知道适当 URL 的任何人都可以看到 grafana 数据,这似乎是一个巨大的漏洞。

然后我看到grafana有HTTP API但我看不到在那里显示某个图表的可能性。

我已经尝试过使用 PHP Proxy 的解决方案如果用户在我的网站上通过了正确的身份验证,这将添加授权 header 并连接到 grafana 嵌入 URL。但是,它不起作用,配置起来简直就是一场噩梦。

最后的选择是从服务器端的 grafana 抓取图形的 png 文件,并只为我网站上经过身份验证的管理员提供它们。但是,在这种情况下,我会放弃 grafana 提供的 OOTB 的所有酷东西,例如扩展/折叠时间范围、自动刷新等。

最佳答案

基于 this answerthis answer我能够在我的页面中嵌入 Grafana 仪表板。

将您的iframe:

<iframe id="dashboard"></iframe>

然后使用像这样的 AJAX 请求将 Grafana 的内容提供给它:

<script type="text/javascript">
$.ajax(
{
type: 'GET',
url: 'http://localhost:3000/dashboard/db/your-dashboard-here',
contentType: 'application/json',
beforeSend: function(xhr, settings) {
xhr.setRequestHeader(
'Authorization', 'Basic ' + window.btoa('admin:admin')
);
},
success: function(data) {
$('#dashboard').attr('src', 'http://localhost:3000/dashboard/db/your-dashboard-here');
$('#dashboard').contents().find('html').html(data);
}
}
);
</script>

AJAX 请求是强制性的,因为它使您能够使用您的凭据设置 header 。

此刻,由于 CORS,您从 Grafana 服务器收到空响应。您要做的是为 Grafana 启用一些代理。下面是使用 docker-compose 的 Grafana 和 nginx docker 容器的示例配置:

version: '2.1'
services:
grafana:
image: grafana/grafana
nginx:
image: nginx
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- 3000:80

您要做的最后一件事是提供您的 nginx.conf 文件:

events {
worker_connections 1024;
}

http {
#
# Acts as a nginx HTTPS proxy server
# enabling CORS only to domains matched by regex
# /https?://.*\.mckinsey\.com(:[0-9]+)?)/
#
# Based on:
# * http://blog.themillhousegroup.com/2013/05/nginx-as-cors-enabled-https-proxy.html
# * http://enable-cors.org/server_nginx.html
#
server {
listen 80;

location / {
#if ($http_origin ~* (https?://.*\.tarunlalwani\.com(:[0-9]+)?$)) {
# set $cors "1";
#}
set $cors "1";

# OPTIONS indicates a CORS pre-flight request
if ($request_method = 'OPTIONS') {
set $cors "${cors}o";
}

# Append CORS headers to any request from
# allowed CORS domain, except OPTIONS
if ($cors = "1") {
add_header Access-Control-Allow-Origin $http_origin always;
add_header Access-Control-Allow-Credentials true always;
proxy_pass http://grafana:3000;
}

# OPTIONS (pre-flight) request from allowed
# CORS domain. return response directly
if ($cors = "1o") {
add_header 'Access-Control-Allow-Origin' '$http_origin' always;
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always;
add_header Content-Length 0;
add_header Content-Type text/plain;
return 204;
}

# Requests from non-allowed CORS domains
proxy_pass http://grafana:3000;
}
}

}

此文件基于提供的 here , 但重要的区别是

add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always;

这表明您允许设置 Authorization header 。

关于php - 如何在我网站的管理面板中安全地显示 grafana 图表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42303800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com