set session - Benutzerdefinierte Variable zum Speichern der Benutzer-ID

10

Ich möchte die Benutzer-ID in einer benutzerdefinierten Sitzungsvariablen speichern und in Triggerprozeduren verwenden (lesen), um Benutzeraktionen zu autorisieren. Ich habe so etwas gefunden:

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

und es scheint zu funktionieren - ich dachte, dass "myapp.user" in der .conf-Datei deklariert werden sollte, aber es scheint, dass ich Sitzungsvariablen im laufenden Betrieb erstellen kann (ich habe die .conf-Datei überhaupt nicht geändert).

Gibt es einen Nachteil, wenn man so etwas macht?

user606521
quelle
2
Ich denke, die Einschränkung, myapp.userdie in deklariert werden muss, postgresql.confwurde in 9.2 oder 9.1 entfernt
a_horse_with_no_name
5
Dies ist eine vernünftige Methode, solange der Benutzer kein beliebiges SQL ausführen darf (in diesem Fall kann er einfach eine andere Benutzer-ID festlegen). Es ist eine etwas umständliche Problemumgehung für das Fehlen echter Sitzungsvariablen von PostgreSQL, aber mir sind keine wesentlichen Probleme damit bekannt. Übrigens, bitte verlinken Sie auf alle relevanten vorherigen Fragen / Antworten, die Sie als Referenz verwendet haben .
Craig Ringer

Antworten:

8

Vor Version 9.2 mussten Sie dem custom_variable_classesParameter inpostgresql.conf Ihre benutzerdefinierte Klassenvariable hinzufügen , z.

custom_variable_classes = 'myapp'

In 9.2 wurde diese Anforderung entfernt :

Entfernen Sie den Parameter custom_variable_classes (Tom Lane).

Die Überprüfung durch diese Einstellung war zweifelhaft. Jetzt kann jeder Einstellung ein beliebiger Klassenname vorangestellt werden.

Seit 9.2 können Sie Ihre benutzerdefinierte Klassenvariable einfach so festlegen, wie Sie es gerade tun. Sie müssen sich also keine Gedanken über Änderungen machen postgresql.conf.

MatheusOl
quelle
0

Für solche Fälle möchte ich eine plperl-Funktion wie diese erstellen:

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;

Dies hat den Vorteil, dass es auch in SQL-Anweisungen funktioniert, zum Beispiel:

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