Grafana: [功能请求]添加当前用户作为模板变量

创建于 2016-05-05  ·  45评论  ·  资料来源: grafana/grafana

有什么方法可以在针对influxdb后端的查询中使用“当前grafana用户”的详细信息,无论是其电子邮件地址还是用户名?

要求:我正在为许多(也许数千个)用户存储个人数据。 我当前的实现选择是单个influxdb数据库和单个度量值,并带有一个标签来标识每个度量值所属的用户。 我可以自由使用电子邮件,用户名或其他任何可以用作该标签中实际用户身份的内容。

理想情况下,我会以某种方式让grafana注入类似“ where user = fred”的子句,以便后端始终只返回与该特定用户有关的数据。

安全性:我了解安全隐患,并且任何知识渊博的恶意用户都将能够使用http工具来探查其他用户的数据。 但是,我打算在nginx前端中对此添加检查,以作为grafana的反向代理。 我的计划是,nginx将检查对GET / api / datasources / proxy /:datasourceId / *的传入API调用,并确保它们包含与当前登录用户匹配的where子句。 听起来很轻松:)

aredashboartemplating help wanted prioritnice-to-have typfeature-request

最有用的评论

将其作为内置变量仍然会很好

所有45条评论

目前尚不可能。

我使用反向代理成功解决了这个问题,该代理拦截了grafana后端的“ / api / datasources / proxy /:datasourceId / *” API调用,并注入了where子句。 结合grafana出色的身份验证代理行为,现在我现在不需要此功能。 实际上,基于Torkelo先前对安全性提出的一些观点,以及后端数据库缺乏对用户级别的强制执行,我认为目前这种行为可能不属于Grafana。

@abraae您能详细说明如何实现此功能吗?

@abraae +1
你能解释一下你做了什么吗?

抱歉,没有时间记录我的工作,而是从内存中记录下来:

  • 使用nginx作为grafana服务器之前的反向代理,即,所有到grafana服务器的传入流量都通过nginx
  • 设置nginx conf。 捕获对/ api / datasources / proxy /:datasourceId / *的调用
  • 而不是通过它们,而是使用Nginx重写以添加where子句

因此,基本上,您所做的就是始终在所有返回grafana后端的API调用中强制使用额外的where子句。

为了使它从内存中工作,我不得不做很多事情:)对不起,没有更多帮助。

    --

@abraae Thx为您解答。
是否可以在nginx.conf中查看所做的工作?

当然,这是nginx.conf。

[糟糕的文件-参见下文]

我在您的文件中看不到如何捕获/ api / datasources / proxy /:datasourceId / *
你做了什么 ? 您的重写规则在哪里? :-)

抱歉,文件错误,请尝试以下操作: https :

将其作为内置变量仍然会很好

是否将用户名作为查询中的变量实现?

我也希望此功能及其原因如下:

假设您有一个仪表板,其中列出了来自ITSM工具的请求,并且希望图形仅显示分配给已登录用户的请求。
在仪表板中设置一个指向登录用户名的变量的能力可以解决我所在的公司(International BIG Company)中的问题。

另一个示例是使用登录的用户名访问该部门,并仅使用该用户名显示与该部门相关的数据。

添加要在仪表板中使用的全局变量以指向已登录的用户,这样就可以使用它,这并不难。

可以说:
$ Grafana.User.Email = [email protected]
$ Grafana.User.Name =甘道夫
$ Grafana.User.Surname = TheWize
$ Grafana.User.Username = GDog

这将解决人们使用Grafana时遇到的许多问题和局限性,我强烈建议您考虑实施此方法。

关于这个有什么消息吗?

这事有进一步更新吗?

我还将发现此功能非常有用。

我也真的需要此功能atm。 我正在部署带有财务信息的用户特定仪表板,该信息仅应显示相应的用户数据。 为此目的,在同一仪表盘上制作25个副本会感到不必要的繁琐。

+1

+1

我想使用此值来限制对变量的访问(授权)
这将是最好的解决方案

+1
用例是一个用户只能看到自己部门的信息。
它可以用作ACL,而不是为每个部门创建新的副本仪表板。

+1

大家好,我想使用授权代码流[1]将Grafana与OIDC身份提供程序集成,以使平台提供的不同UI之间具有SSO。 作为主要要求,我必须保证多租户,所以最好的解决方案应该是使用JWT中IdP返回的用户声明之一作为grafana用于从db检索数据的查询参数。包含已登录用户所属的tenantId的声明。

[1] https://grafana.com/docs/auth/generic-oauth/

有没有人实施过类似的东西或有任何建议呢?

先感谢您

+1

我的特定用例是使模板变量根据登录的用户来应用不同的过滤(Prometheus标签值)。

换句话说,模板变量的“ regex”字段的内容可以是动态的,并且取决于登录用户。

为此,Grafana中的每个用户都可以具有一些可选的元数据字段,这些字段由管理员在用户创建时设置。 这些可选的元数据字段可以从模板变量的“ regex”字段中引用。

这可以允许应用这种“动态”过滤,其值设置由上级管理员控制。

非常感谢!

+1

$__currentUserEmail太棒了。

+1

+1

+1我想为我们的大学用户制作一个仪表板,以便他们可以根据用户名查看其WiFi和VPN统计信息。 在致电服务台之前,这可以帮助他们解决连接问题!

+1

在我看来,没有任何进展:(这将非常有用。

++

嗨!

有人成功使用@abraae代码实现了此解决方案吗?
我正在尝试将其与grafana-azure-data-explorer(Kusto DB)一起使用

谢谢!!

+1

你好

我的解决方法基于SimpleJSON数据源(https://github.com/grafana/simple-json-datasource)

主要思想是启用X-Grafana-User标头,然后将其从DS返回,以填充模板变量

实施: https :

@rlklaser是Express JS的示例吗?
还是可以共享.war文件?
这不适用于Express JS(((

app.get('/query', function (req, res) {
  res.status(200);
  res.json({ username: req.header('X-Grafana-User') })
});

app.get('/search', function (req, res) {
  res.status(200);
  res.json({ username: req.header('X-Grafana-User') })
});

并且我想使用https://github.com/simPod/grafana-json-datasource作为DS

@baur必须将grafana defaults.ini更改为:

[dataproxy]

日志=真
send_user_header = true

该请求是两年前创建的,我还没有看到任何更新。 我相信这对于包括我在内的许多人都是非常有用的工具。

是否有任何更新?

如何在SimpleJson GRAFANA中获取/ api / user / teams的结果,以及如何在变量中获取“名称”值的查询是什么?
https://www.logiserv.re/api/user/teams上的Grafana http api结果示例

对于个性化仪表板,我们也非常需要此功能

+1

现在,模板为__org添加了全局变量支持,对此是否有任何更新? https://github.com/grafana/grafana/pull/21790

似乎通过添加__user变量将使用相同的机制:

    templateSrv.setGlobalVariable('__user', {
      value: {
        name: contextSrv.user.login,
        id: contextSrv.user.id,
        toString: function() {
          return this.id;
        },
      },
    });

++ 1
Grafana开发团队,
这将是非常有用的功能,它将使我们的数据授权工作变得非常容易。我们正在评估并正在大规模实施基于Grafana的报告服务,其中包括与多个数据源的连接。
此特定功能对于多租户部署中的数据安全性至关重要。

++ 1,您好,Grafana开发团队,
这对我们来说是非常有用的功能,我们要基于用户进行特定查询的数据访问控制,不同的用户看到不同的范围。

Grafana开发团队,非常感谢您提供的非常有用的功能!

在仪表板变量定义内的查询中使用该变量时,该变量似乎不起作用。

此页面是否有帮助?
0 / 5 - 0 等级