imposta sessione - variabile personalizzata per memorizzare l'ID utente


10

Voglio archiviare l'ID utente nella variabile di sessione personalizzata e usarlo (leggi) nelle procedure di attivazione per autorizzare le azioni dell'utente. Ho trovato qualcosa del genere:

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

e sembra funzionare - ho pensato che "myapp.user" dovrebbe essere dichiarato nel file .conf ma sembra che io possa creare al volo le variabili di sessione (non ho cambiato affatto il file .conf).

C'è qualche svantaggio di fare così?


2
Penso che la restrizione che myapp.userdeve essere dichiarata in sia postgresql.confstata rimossa in 9.2 o 9.1
a_horse_with_no_name

5
È un modo ragionevole di fare le cose purché l'utente non sia autorizzato a eseguire SQL arbitrario (nel qual caso potrebbe semplicemente impostare un ID utente diverso). È un po 'una strana soluzione alternativa per la mancanza di variabili di sessione reali di PostgreSQL, ma non sono a conoscenza di problemi significativi con esso. A proposito, si prega di collegarsi a tutte le domande / risposte precedenti pertinenti utilizzate come riferimento .
Craig Ringer,

Risposte:


8

Prima della versione 9.2, era necessario aggiungere la variabile di classe personalizzata al custom_variable_classesparametro inpostgresql.conf , come:

custom_variable_classes = 'myapp'

In 9.2, questo requisito è stato rimosso :

Rimuovi il parametro custom_variable_classes (Tom Lane)

Il controllo fornito da questa impostazione era dubbio. Ora qualsiasi impostazione può essere preceduta da qualsiasi nome di classe.

Quindi, dal 9.2 puoi semplicemente impostare la tua variabile di classe personalizzata come stai facendo attualmente, senza preoccuparti di cambiare postgresql.conf.



0

Per casi come questo mi piace creare una funzione plperl come questa:

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;

Il vantaggio è che funziona anche con le istruzioni sql, ad esempio:

select session_store('user',12345::text);
insert into mytable(userid) values(session_store('user')::integer);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.