set session - пользовательская переменная для хранения идентификатора пользователя

10

Я хочу сохранить идентификатор пользователя в пользовательской переменной сеанса и использовать его (чтение) в процедурах триггера для авторизации действий пользователя. Я нашел что-то вроде этого:

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

и это похоже на работу - я думал, что «myapp.user» должен быть объявлен в файле .conf, но кажется, что я могу создавать переменные сеанса на лету (я не изменил файл .conf вообще).

Есть ли недостаток в том, чтобы делать это?

user606521
источник
2
Я думаю, что ограничение, myapp.userкоторое должно быть объявлено, postgresql.confбыло снято в 9.2 или 9.1
a_horse_with_no_name
5
Это разумный способ сделать что-то, если пользователю не разрешено запускать произвольный SQL (в этом случае он может просто установить другой идентификатор пользователя). Это немного хакерский обходной путь для отсутствия в PostgreSQL истинных переменных сеанса, но я не знаю каких-либо существенных проблем с ним. Кстати, пожалуйста, ссылку на любые соответствующие предыдущие вопросы / ответы, которые вы использовали в качестве ссылки .
Крейг Рингер

Ответы:

8

До версии 9.2 вам нужно было добавить свою переменную класса в custom_variable_classesпараметрpostgresql.conf , например:

custom_variable_classes = 'myapp'

В 9.2 это требование было удалено :

Удалить параметр custom_variable_classes (Том Лейн)

Проверка, предоставленная этим параметром, была сомнительной. Теперь любой настройке может предшествовать любое имя класса.

Итак, начиная с 9.2, вы можете просто установить свою переменную пользовательского класса, как вы делаете в настоящее время, не нужно беспокоиться об изменении postgresql.conf.

MatheusOl
источник
0

В таких случаях я хотел бы создать функцию plperl:

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;

Преимущество этого в том, что он работает и в операторах sql, например:

select session_store('user',12345::text);
insert into mytable(userid) values(session_store('user')::integer);
soger
источник