Grafana: [Solicitação de recurso] Adicionar usuário atual como variável de modelo

Criado em 5 mai. 2016  ·  45Comentários  ·  Fonte: grafana/grafana

Existe alguma maneira de usar os detalhes do "usuário grafana atual" em uma consulta em um back end influxdb, seja seu endereço de e-mail ou nome de usuário?

Requisito: Estou armazenando dados pessoais de muitos (talvez milhares) de usuários. Minha escolha de implementação atual é um único banco de dados influxdb e uma única medida, com uma tag para identificar o usuário a que cada medida pertence. Tenho liberdade para usar e-mail, nome de usuário ou qualquer outra coisa que funcione como a identidade real do usuário nessa tag.

O ideal é que, de alguma forma, a grafana injete uma cláusula como "where user = fred 'para que o back end sempre retorne apenas os dados relacionados a esse usuário específico.

Segurança: Eu entendo a exposição da segurança e que qualquer usuário experiente + malicioso será capaz de usar ferramentas http para investigar os dados de outros usuários. No entanto, pretendo adicionar uma verificação para isso no front end do nginx que atua como um proxy reverso para grafana. Meu plano é que o nginx inspecione as chamadas de API de entrada para GET / api / datasources / proxy /: datasourceId / * e garanta que elas contenham uma cláusula where que corresponda ao usuário conectado no momento. Parece um pedaço de bolo :)

aredashboartemplating help wanted prioritnice-to-have typfeature-request

Comentários muito úteis

Ainda seria bom tê-lo como uma variável embutida

Todos 45 comentários

Isso não é possível no momento.

Consegui contornar isso com sucesso com um proxy reverso que intercepta as chamadas de API "/ api / datasources / proxy /: datasourceId / *" no backend grafana e injeta uma cláusula where. Em conjunto com o incrível comportamento do proxy de autenticação do grafana, agora não preciso desse recurso. Na verdade, com base em algumas das visões declaradas anteriormente de Torkelo sobre segurança e a falta de aplicação de nível de usuário por bancos de dados de back-end, acho que esse comportamento provavelmente não pertence ao Grafana no momento.

@abraae Você pode explicar como implementar esse recurso?

@abraae +1
você poderia explicar o que você fez?

Desculpe, não tenho tempo para documentar o que fiz, mas de memória:

  • use o nginx como um proxy reverso na frente do servidor grafana, ou seja, todo o tráfego de entrada para o servidor grafana passa pelo nginx
  • configurar nginx conf. para capturar chamadas para / api / datasources / proxy /: datasourceId / *
  • em vez de transmiti-los, reescreva usando nginx para adicionar uma cláusula where

Então, basicamente, o que você está fazendo é sempre forçar uma cláusula where extra em todas as chamadas de API que voltam para o back end grafana.

Tive de fazer muito para que funcionasse de memória :) Lamento não poder ajudar mais.

    -

@abraae Thx por sua resposta.
É possível ver o que você fez no nginx.conf?

Claro, aqui está o nginx.conf.

[opa arquivo errado - veja abaixo]

Não vejo em seu arquivo como você captura / api / datasources / proxy /: datasourceId / *
O que você fez ? Onde está sua regra de reescrita ?? :-)

Ah, desculpe, arquivo errado, tente isto: https://gist.github.com/abraae/c209b537350b2b2d9703ba126872cc3f

Ainda seria bom tê-lo como uma variável embutida

É implementar o nome de usuário como uma variável na consulta?

Eu também gostaria dessa função e o motivo para isso é o seguinte:

Digamos que você tenha um painel em que lista as solicitações de uma ferramenta ITSM e deseja que os gráficos mostrem apenas as solicitações atribuídas ao usuário conectado.
A capacidade de definir uma variável no painel que aponta para o nome de usuário conectado resolveria nosso problema na empresa onde trabalho (International BIG Company).

Outro exemplo é usar o nome de usuário logado para chegar lá departamento e usar isso para mostrar apenas os dados relacionados a esse departamento.

Adicionar uma variável global a ser usada em painéis que apontam para o usuário conectado para que possa ser usada não deve ser tão difícil de fazer.

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

Isso resolveria muitos problemas e limitações que as pessoas têm com o Grafana, e eu recomendo fortemente que você considere a implementação disso.

Algumas notícias sobre este?

alguma atualização disso?

Eu também acharia esse recurso muito útil.

Eu também preciso muito desse recurso atm. Estou trabalhando na implantação de painéis específicos do usuário com informações financeiras que devem mostrar apenas os respectivos dados dos usuários. Fazer 25 cópias do mesmo painel para essa finalidade parece desnecessariamente tedioso.

+1

+1

Quero usar este valor para restringir o acesso às variáveis ​​(autorização)
Seria a melhor solução para isso

+1
O caso de uso é que um usuário só pode ver as informações de seu próprio departamento.
Ele poderia ser usado como uma ACL em vez de criar um novo painel de cópia para cada departamento.

+1

Olá a todos, gostaria de integrar o Grafana com o provedor de identidade OIDC usando o fluxo de código de autorização [1] para ter o SSO entre diferentes interfaces de usuário fornecidas pela plataforma. Como requisito principal tenho que garantir multilocação, então a melhor solução deve ser usar uma das declarações do usuário retornadas pelo IdP no JWT como um parâmetro de consulta usado pela grafana para recuperar dados do banco de dados, em particular eu usaria a declaração que contém o tenantId ao qual o usuário conectado pertence.

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

Alguém implementou algo semelhante ou tem alguma sugestão para fazê-lo?

Agradeço antecipadamente

+1

Meu caso de uso específico seria criar variáveis ​​de modelo para aplicar diferentes filtros (valores de rótulo do Prometheus) dependendo do usuário conectado.

Em outras palavras, o conteúdo do campo "regex" da variável de modelo pode ser dinâmico e dependente do usuário conectado.

Para fazer isso, cada usuário no Grafana pode ter alguns campos de metadados opcionais que são definidos pelo administrador no momento da criação do usuário. Esses campos de metadados opcionais podem ser referenciados no campo "regex" da variável de modelo.

Isso pode permitir a aplicação dessa filtragem "dinâmica", cuja configuração de valor é controlada por um administrador de nível superior.

Muito obrigado!

+1

$__currentUserEmail seria incrível.

+1

+1

+1 Eu adoraria fazer um painel para nossos usuários universitários para que eles pudessem ver suas estatísticas de WiFi e VPN com base em seu nome de usuário. Isso pode ajudá-los a solucionar problemas de conexão antes de ligar para o suporte técnico!

+1

Parece-me que não há progresso :( Isso seria muito útil.

++

Oi!

Alguém conseguiu implementar esta solução com o código @abraae ?
Estou tentando usá-lo com grafana-azure-data-explorer (Kusto DB)

Obrigado!!

+1

Oi,

Minha solução alternativa é baseada na fonte de dados SimpleJSON (https://github.com/grafana/simple-json-datasource)

A ideia principal é Habilitar o cabeçalho X-Grafana-User e retorná-lo do DS para preencher uma variável de modelo

Implementação: https://github.com/rlklaser/grafana-logged-user

@rlklaser está aqui algum exemplo para Express JS?
ou você pode compartilhar o arquivo .war ?
isso não funciona para mim no 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') })
});

e eu gostaria de usar https://github.com/simPod/grafana-json-datasource como DS

@baur deve alterar grafana defaults.ini para:

[dataproxy]

logging = true
send_user_header = true

Este pedido foi criado há dois anos e não vi nenhuma atualização sobre isso. Acredito que essa seria uma ferramenta muito útil para muitas pessoas, inclusive eu.

Existe alguma atualização sobre isso?

Como obter o resultado de / api / user / times em um SimpleJson GRAFANA e qual a consulta para obter valores de "name" em uma variável?
Exemplo de resultado da API Grafana http em https://www.logiserv.re/api/user/teams

Também precisamos muito desse recurso para painéis personalizados

+1

Alguma atualização sobre isso agora que a modelagem adicionou suporte a variável global para __org? https://github.com/grafana/grafana/pull/21790

Parece que adicionar uma variável __user usaria o mesmo mecanismo:

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

++ 1
Grafana Dev Team,
Esse recurso seria muito útil e tornará o trabalho de autorização de dados muito mais fácil para nós. Estamos avaliando e no processo de implementação do serviço de relatório baseado em Grafana em maior escala, que inclui conectividade com várias fontes de dados.
Esse recurso específico será crucial para a segurança de dados em implantação multilocatário.

++ 1, olá equipe de desenvolvimento Grafana,
este é um recurso muito útil para nós, queremos fazer controle de acesso a dados com base no usuário para uma consulta específica, um usuário diferente vê um escopo diferente.

Grafana Dev Team, muito obrigado pelo recurso muito útil !!!

A variável parece não funcionar quando usada em uma consulta dentro das definições de variáveis ​​dos painéis.

Esta página foi útil?
0 / 5 - 0 avaliações