setel sesi - variabel khusus untuk menyimpan id pengguna

10

Saya ingin menyimpan id pengguna dalam variabel sesi khusus dan menggunakannya (baca) dalam prosedur pemicu untuk mengotorisasi tindakan pengguna. Saya menemukan sesuatu seperti ini:

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

dan tampaknya berfungsi - saya pikir "myapp.user" harus dideklarasikan dalam file .conf tetapi tampaknya saya dapat membuat variabel sesi dengan cepat (saya tidak mengubah file .conf sama sekali).

Apakah ada kerugian melakukan seperti ini?

pengguna606521
sumber
2
Saya pikir batasan yang myapp.userharus dideklarasikan postgresql.conftelah dihapus pada 9,2 atau 9,1
a_horse_with_no_name
5
Ini adalah cara yang masuk akal untuk melakukan hal-hal selama pengguna tidak diizinkan menjalankan SQL sewenang-wenang (dalam hal ini mereka hanya dapat menetapkan ID pengguna yang berbeda). Ini sedikit pemecahan masalah karena kurangnya variabel sesi PostgreSQL yang sebenarnya, tetapi saya tidak mengetahui adanya masalah signifikan dengannya. BTW, harap tautkan ke pertanyaan / jawaban sebelumnya yang relevan yang Anda gunakan sebagai referensi .
Craig Ringer

Jawaban:

8

Sebelum versi 9.2, Anda perlu menambahkan variabel kelas khusus ke custom_variable_classesparameter dalampostgresql.conf , seperti:

custom_variable_classes = 'myapp'

Dalam 9.2, persyaratan ini telah dihapus :

Hapus parameter custom_variable_classes (Tom Lane)

Pemeriksaan yang diberikan oleh pengaturan ini meragukan. Sekarang pengaturan apa pun dapat diawali dengan nama kelas apa saja.

Jadi, karena 9.2 Anda hanya dapat mengatur variabel kelas kustom Anda seperti yang Anda lakukan saat ini, tidak perlu khawatir tentang perubahan postgresql.conf.

MatheusOl
sumber
0

Untuk kasus seperti ini saya ingin membuat fungsi plperl seperti ini:

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;

Keuntungan dari ini adalah bahwa ia berfungsi dalam pernyataan sql juga, misalnya:

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