definir sessão - variável personalizada para armazenar o ID do usuário

10

Desejo armazenar o ID do usuário na variável de sessão personalizada e usá-lo (ler) nos procedimentos do acionador para autorizar ações do usuário. Eu encontrei algo assim:

set session "myapp.user" = '12345';
...
SELECT current_setting('myapp.user');

e parece funcionar - eu pensei que "myapp.user" deveria ser declarado no arquivo .conf, mas parece que eu posso criar variáveis ​​de sessão rapidamente (eu não mudei o arquivo .conf).

Existe alguma desvantagem de fazer assim?

user606521
fonte
2
Eu acho que a restrição que myapp.userdeve ser declarado no postgresql.conffoi removido em 9.2 ou 9.1
a_horse_with_no_name
5
É uma maneira razoável de fazer as coisas, desde que o usuário não tenha permissão para executar SQL arbitrário (nesse caso, ele poderá definir um ID de usuário diferente). É uma solução alternativa para a falta de variáveis ​​de sessão verdadeiras do PostgreSQL, mas não estou ciente de nenhum problema significativo. Entre, faça o link para todas as perguntas / respostas anteriores relevantes que você usou como referência .
Craig campainha

Respostas:

8

Antes da versão 9.2, você precisava adicionar sua variável de classe personalizada ao custom_variable_classesparâmetropostgresql.conf , como:

custom_variable_classes = 'myapp'

Na 9.2, este requisito foi removido :

Remova o parâmetro custom_variable_classes (Tom Lane)

A verificação fornecida por essa configuração foi duvidosa. Agora qualquer configuração pode ser prefixada por qualquer nome de classe.

Portanto, desde a 9.2, você pode apenas definir sua variável de classe personalizada como está fazendo atualmente, não precisa se preocupar em mudar postgresql.conf.

MatheusOl
fonte
0

Para casos como esse, gosto de criar uma função plperl como esta:

CREATE OR REPLACE FUNCTION session_store(key text,val text DEFAULT NULL)
  RETURNS text AS
$BODY$
my ($k,$v)=@_;
die "key cannot be NULL\n" unless defined $k;
if (defined $v) {
    $_SHARED{session_store}{$k}=$v;
    return undef;
}
return exists $_SHARED{session_store}{$k}?$_SHARED{session_store}{$k}:undef;
$BODY$
LANGUAGE plperl VOLATILE;

A vantagem disso é que ele também funciona em instruções sql, por exemplo:

select session_store('user',12345::text);
insert into mytable(userid) values(session_store('user')::integer);
soger
fonte