Mondi su mondi, sistemi di sistemi.

PostgreSQL: passare le informazioni di sessione dall’applicazione

Nelle appli­ca­zioni che sfrut­tano una con­nes­sione per­si­stente verso il data­base e imple­men­tano al loro interno la logica di auten­ti­ca­zione e auto­riz­za­zione, può pre­sen­tarsi la neces­sità di pas­sare al data­base delle infor­ma­zioni rela­tive all’utente dell’applicazione, che sarà diverso da quello usato per con­net­tersi al database.

In molti casi, se si tratta solo di inse­rire le infor­ma­zioni di audi­ting su poche tabelle, è suf­fi­ciente che sia l’applicazione a pas­sare espli­ci­ta­mente que­ste infor­ma­zioni, durante il sal­va­tag­gio dei record. Se l’auditing va fatto su tutte le tabelle si può pro­get­tare il codice in modo da ren­dere l’operazione più o meno trasparente.

Non sem­pre que­sto è pos­si­bile — le modi­fi­che al codice sareb­bero troppo one­rose o impos­si­bili — né ade­guato. Ad esem­pio, quando vogliamo trac­ciare even­tuali atti­vità svolte al di fuori del con­trollo dell’applicazione. In que­sti casi la solu­zione dev’essere tro­vata al livello del database.

Il pro­blema diventa quindi come pas­sare in modo tra­spa­rente i dati sull’utente dell’applicazione. Una pos­si­bi­lità con­si­ste nell’usare le cosid­dette opzioni custom in com­bi­na­zione con le trigger.

Al login sull’applicazione verrà chia­mata una fun­zione che impo­sta il valore dell’opzione custom:

CREATE OR REPLACE FUNCTION begin_sess(staffid text)
RETURNS void AS $$ BEGIN
    PERFORM set_config(
        'mysess.curr_user',
        coalesce(staffid,''),
        false
    );
END; $$ LANGUAGE 'plpgsql' VOLATILE

Con que­sta infor­ma­zione, basta aggan­ciare una trig­ger ad ogni tabella che ci interessa:

...
DECLARE
   curr_user	staff.staff_id%TYPE;
BEGIN
   SELECT current_setting('mysess.curr_user') INTO curr_user;
...

Se il valore di mysess.curr_user fosse vuoto, ad es. per­ché l’operazione viene fatta diret­ta­mente sul data­base, basterà ripie­gare sull’utente a livello del database.

Le infor­ma­zioni ripor­tate qui sono state rica­vate più o meno pedis­se­qua­mente da que­sto thread: Audit Trigger puzz­ler.

Per proseguire

Commenti e trackback sono disabilitati.