définir la session - variable personnalisée pour stocker l'ID utilisateur

10

Je veux stocker l'ID utilisateur dans une variable de session personnalisée et l'utiliser (lire) dans les procédures de déclenchement pour autoriser les actions de l'utilisateur. J'ai trouvé quelque chose comme ça:

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

et cela semble fonctionner - je pensais que "myapp.user" devrait être déclaré dans le fichier .conf mais il semble que je puisse créer des variables de session à la volée (je n'ai pas du tout changé le fichier .conf).

Y a-t-il un inconvénient à faire comme ça?

user606521
la source
2
Je pense que la restriction qui myapp.userdoit être déclarée dans a postgresql.confété supprimée en 9.2 ou 9.1
a_horse_with_no_name
5
C'est une façon raisonnable de faire les choses tant que l'utilisateur n'est pas autorisé à exécuter du SQL arbitraire (auquel cas il peut simplement définir un ID utilisateur différent). C'est un peu une solution de contournement hacky pour le manque de PostgreSQL de vraies variables de session, mais je ne suis pas au courant de problèmes importants avec cela. BTW, veuillez créer un lien vers toutes les questions / réponses antérieures pertinentes que vous avez utilisées comme référence .
Craig Ringer

Réponses:

8

Avant la version 9.2, vous deviez ajouter votre variable de classe personnalisée au custom_variable_classesparamètre danspostgresql.conf , comme:

custom_variable_classes = 'myapp'

Dans 9.2, cette exigence a été supprimée :

Supprimez le paramètre custom_variable_classes (Tom Lane)

La vérification fournie par ce paramètre était douteuse. Désormais, tout paramètre peut être préfixé par n'importe quel nom de classe.

Donc, depuis 9.2, vous pouvez simplement définir votre variable de classe personnalisée comme vous le faites actuellement, pas besoin de vous soucier de changer postgresql.conf.

MatheusOl
la source
0

Pour des cas comme celui-ci, j'aime créer une fonction plperl comme celle-ci:

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;

L'avantage de cela est qu'il fonctionne également dans les instructions SQL, par exemple:

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