设置会话-用于存储用户ID的自定义变量


10

我想将用户ID存储在自定义会话变量中,并在触发过程中使用它(读取)来授权用户操作。我发现了这样的事情:

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

似乎可行-我认为应在.conf文件中声明“ myapp.user”,但似乎可以即时创建会话变量(我根本没有更改.conf文件)。

这样做有什么缺点吗?


2
我认为myapp.user必须postgresql.conf在9.2或9.1中删除了必须声明的限制
a_horse_with_no_name 2015年

5
只要不允许用户运行任意SQL(在这种情况下,他们可以设置其他用户ID),这是一种合理的处理方法。对于PostgreSQL缺少真正的会话变量来说,这是一个棘手的解决方法,但我不知道它有任何重大问题。顺便说一句,请链接到您用作参考的任何相关先前的问题/答案
Craig Ringer

Answers:


8

在9.2版之前,您需要将自定义类变量添加到中的custom_variable_classes参数中postgresql.conf,例如:

custom_variable_classes = 'myapp'

9.2中,此要求已删除

删除custom_variable_classes参数(Tom Lane)

此设置提供的检查是可疑的。现在,任何设置都可以以任何类名作为前缀。

因此,从9.2开始,您可以像当前一样设置自定义类变量,无需担心change postgresql.conf



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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.