Grafana: [Solicitud de función] Agregar usuario actual como variable de plantilla

Creado en 5 may. 2016  ·  45Comentarios  ·  Fuente: grafana/grafana

¿Hay alguna forma de utilizar los detalles del "usuario actual de grafana" en una consulta contra un back-end de influxdb, ya sea su dirección de correo electrónico o nombre de usuario?

Requisito: estoy almacenando datos personales de muchos (quizás miles) de usuarios. Mi opción de implementación actual es una sola base de datos influxdb y una sola medición, con una etiqueta para identificar al usuario al que pertenece cada medición. Tengo la libertad de utilizar el correo electrónico, el nombre de usuario o cualquier otra cosa que funcione como la identidad del usuario real en esa etiqueta.

Lo ideal sería que de alguna manera grafana inyectara una cláusula como "where user = fred" para que el back-end siempre devuelva solo los datos relacionados con ese usuario en particular.

Seguridad: Entiendo la exposición a la seguridad y que cualquier usuario malintencionado y con conocimiento podrá utilizar herramientas http para sondear los datos de otros usuarios. Sin embargo, tengo la intención de agregar una verificación para esto en el front-end de nginx que actúa como un proxy inverso de grafana. Mi plan es que nginx inspeccionará las llamadas API entrantes a GET / api / datasources / proxy /: datasourceId / * y se asegurará de que contengan una cláusula where que coincida con el usuario actualmente conectado. Suena pan comido :)

aredashboartemplating help wanted prioritnice-to-have typfeature-request

Comentario más útil

Sería bueno tenerlo como una variable incorporada

Todos 45 comentarios

Eso no es posible por el momento.

Trabajé con éxito alrededor de esto con un proxy inverso que intercepta las llamadas a la API "/ api / datasources / proxy /: datasourceId / *" en el back-end de grafana e inyecta una cláusula where. Junto con el increíble comportamiento de proxy de autenticación de grafana, ahora no necesito esta función. De hecho, según algunas de las opiniones de Torkelo sobre seguridad expresadas anteriormente, y la falta de aplicación del nivel de usuario por parte de las bases de datos de back-end, creo que este comportamiento probablemente no pertenezca a Grafana en este momento.

@abraae ¿Puedes explicar cómo implementas esta función?

@abraae +1
¿podrías explicar lo que has hecho?

Lo siento, no tengo tiempo para documentar lo que hice, pero de memoria:

  • use nginx como un proxy inverso frente al servidor grafana, es decir, todo el tráfico entrante al servidor grafana pasa a través de nginx
  • configurar nginx conf. para capturar llamadas a / api / datasources / proxy /: datasourceId / *
  • en lugar de pasarlos, vuelva a escribir usando nginx para agregar una cláusula where

Entonces, básicamente, lo que está haciendo es siempre forzar una cláusula where adicional en todas las llamadas a la API que regresan al back-end de grafana.

Tuve que hacer mucho para que funcionara de memoria :) Lo siento, no puedo ser de más ayuda.

    -

@abraae Thx por tu respuesta.
¿Es posible ver lo que ha hecho en nginx.conf?

Claro, aquí está nginx.conf.

[Vaya archivo incorrecto - ver más abajo]

No veo en su archivo cómo captura / api / datasources / proxy /: datasourceId / *
Qué hiciste ? ¿Dónde está tu regla de reescritura? :-)

Ah, lo siento, archivo incorrecto, intente esto: https://gist.github.com/abraae/c209b537350b2b2d9703ba126872cc3f

Sería bueno tenerlo como una variable incorporada

¿Se implementa la toma de nombre de usuario como variable en la consulta?

También me gustaría esta función y el motivo de la siguiente manera:

Supongamos que tiene un panel en el que enumera las solicitudes de una herramienta ITSM y desea que los gráficos solo muestren las solicitudes asignadas al usuario que inició sesión.
La capacidad de establecer una variable en el tablero que apunte al nombre de usuario registrado resolvería nuestro problema en la empresa donde trabajo (International BIG Company).

Otro ejemplo es usar el nombre de usuario registrado para llegar al departamento y usarlo para mostrar solo los datos relacionados con ese departamento.

Agregar una variable global para usar en paneles que apunten al usuario que ha iniciado sesión para que pueda usarse no debería ser tan difícil de hacer.

Digamos:
$ Grafana.User.Email = [email protected]
$ Grafana.User.Name = Gandolf
$ Grafana.User.Surname = TheWize
$ Grafana.User.Username = GDog

Esto resolvería muchos problemas y limitaciones que la gente tiene con Grafana, y le recomiendo encarecidamente que considere implementarlo.

¿Alguna novedad sobre este?

¿Algún avance en esto?

Esta función también me resultará muy útil.

Realmente también necesitaría esta característica atm. Estoy trabajando en la implementación de paneles de control específicos del usuario con información financiera que solo debería mostrar los datos de los usuarios respectivos. Hacer 25 copias del mismo panel para este propósito resulta innecesariamente tedioso.

+1

+1

Quiero usar este valor para restringir el acceso a variables (autorización)
Sería la mejor solución para esto.

+1
El caso de uso es que un usuario solo podría ver información de su propio departamento.
Podría usarse como una ACL en lugar de crear un nuevo panel de copia para cada departamento.

+1

hola a todos, me gustaría integrar Grafana con el proveedor de identidad OIDC usando el flujo de código de autorización [1] para tener el SSO entre las diferentes UI proporcionadas por la plataforma. Como requisito principal, tengo que garantizar la tenencia múltiple, por lo que la mejor solución debería ser utilizar una de las reclamaciones de usuario devueltas por el IdP en el JWT como un parámetro de consulta utilizado por grafana para recuperar datos de la base de datos, en particular yo usaría la reclamación que contiene el tenantId al que pertenece el usuario registrado.

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

¿Alguien ha implementado algo similar o tiene alguna sugerencia para hacerlo?

gracias de antemano

+1

Mi caso de uso específico sería crear variables de plantilla para aplicar diferentes filtros (valores de etiqueta de Prometheus) según el usuario que haya iniciado sesión.

En otras palabras, el contenido del campo "regex" de la variable de plantilla podría ser dinámico y depender del usuario que inició sesión.

Para lograr esto, cada usuario de Grafana podría tener algunos campos de metadatos opcionales que el administrador establece en el momento de la creación del usuario. Estos campos de metadatos opcionales pueden ser referenciados desde el campo "regex" de la variable de plantilla.

Esto podría permitir aplicar este filtrado "dinámico" cuya configuración de valor es controlada por un administrador de nivel superior.

¡Muchas gracias!

+1

$__currentUserEmail sería genial.

+1

+1

+1 Me encantaría crear un panel para los usuarios de nuestra universidad para que pudieran ver sus estadísticas de WiFi y VPN según su nombre de usuario. ¡Podría ayudarlos a solucionar problemas de conexión antes de llamar a la mesa de ayuda!

+1

Me parece que no hay progreso :( Eso sería muy útil.

++

¡Hola!

¿Alguien logró implementar esta solución con el código @abraae ?
Estoy tratando de usarlo con grafana-azure-data-explorer (Kusto DB)

¡¡Gracias!!

+1

Hola,

Mi solución alternativa se basa en la fuente de datos SimpleJSON (https://github.com/grafana/simple-json-datasource)

La idea principal es habilitar el encabezado X-Grafana-User y devolverlo desde DS para completar una variable de plantilla

Implementación: https://github.com/rlklaser/grafana-logged-user

@rlklaser ¿ hay aquí algún ejemplo de Express JS?
o puedes compartir el archivo .war ?
esto no funciona para mí en 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') })
});

y me gustaría usar https://github.com/simPod/grafana-json-datasource como DS

@baur debe cambiar grafana defaults.ini a:

[proxy de datos]

registro = verdadero
send_user_header = true

Esta solicitud se creó hace dos años y no he visto ninguna actualización al respecto. Creo que esta sería una herramienta muy útil para muchas personas, incluido yo.

¿Hay alguna actualización sobre esto?

¿Cómo obtener el resultado de / api / user / teams en un GRAFANA SimpleJson y cuál es la consulta para obtener valores de "name" en una variable?
Ejemplo de resultado de la API http de Grafana en https://www.logiserv.re/api/user/teams

También necesitamos esta función con urgencia para paneles personalizados

+1

¿Alguna actualización sobre esto ahora que las plantillas han agregado soporte de variable global para __org? https://github.com/grafana/grafana/pull/21790

Parece que al agregar una variable __user se usaría el mismo mecanismo:

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

++ 1
Equipo de desarrollo de Grafana,
Esta sería una característica muy útil y nos facilitará mucho el trabajo de autorización de datos. Estamos evaluando y en el proceso de implementar el servicio de informes basado en Grafana a mayor escala que incluye conectividad con múltiples fuentes de datos.
Esta característica específica será crucial para la seguridad de los datos en la implementación de múltiples inquilinos.

++ 1, hola equipo de desarrollo de Grafana,
esta es una característica muy útil para nosotros, queremos hacer un control de acceso a los datos basado en el usuario para una consulta específica, diferentes usuarios ven diferentes alcances.

Equipo de desarrollo de Grafana, muchas gracias por esta característica tan útil.

La variable no parece funcionar cuando se usa en una consulta dentro de las definiciones de variables de los paneles.

¿Fue útil esta página
0 / 5 - 0 calificaciones