以下是我一直在阅读的内容:
http://www.postgresql.org/docs/9.2/static/rules-views.html
http://www.postgresql.org/docs/9.2/static/rules-privileges.html
我的目标是允许登录只能看到它“拥有”的那些行,可以这么说。
假设数据库中的每个表都继承自此表:
create table WHOAMI
(
tenant varchar(25) not null default current_user
);
例如:
create table FOO
(
id int primary key,
invoicedate date
) inherits (WHOAMI);
insert into FOO(id, invoicedate) values(1,now()::date);
select * from FOO;
--abclogin|1|2013-02-01
PostgreSQL中是否存在类似于模式级别的选择规则,影响模式中的所有表和视图,它会在每个select,insert,update或delete语句中附加一个条件:实际上说..AND WHERE TENANT = current_user
?如果没有这样的全局规则,可以逐个表地完成吗?我的尝试没有任何成功,我可能误解了有关如何创建规则的一些事情。这是我试图做的事情:
我尝试创建一个选择规则:
CREATE RULE "_RETURN" AS ON SELECT TO FOO DO INSTEAD
SELECT * FROM FOO where tenant = current_user;
但是出现此错误:ERROR: could not convert table "foo" to a view because it has indexes
我尝试使用 security-barrier 创建视图:
CREATE VIEW TENANTFOO WITH (security_barrier) AS
SELECT * FROM FOO WHERE tenant=current_user;
然后尝试插入:
insert into TENANTFOO(id,invoicedate)
values(2,(now()::date);
但得到此错误:
`ERROR: cannot insert into view "tenantfoo"
HINT: You need an unconditional ON INSERT DO INSTEAD rule
or an INSTEAD OF INSERT trigger.`
在表上实现行级安全性障碍需要哪些步骤?
答案 0 :(得分:2)
在上一个示例中,您需要针对表运行INSERT
或创建另一个规则:ON INSERT TO TENANTFOO DO INSTEAD
。
答案 1 :(得分:1)
您要找的是Row-Level Security,但尚未提供,some work had been done on this thing。我希望这个补丁能够进入即将发布的9.3版本。
与此同时,我一直在使用以下设计。
要求类似,视图应该只提供用于CURRENT_USER
的行。在我们的例子中,访问已经非常简单:一个表,指定给定用户是否具有给定关系和给定键的访问权限,如:
CREATE TABLE user_grants (
user_id integer,
entity_name text, -- should exist in pg_class
entity_id integer
);
然后,对tasks
说,已创建以下视图:
CREATE VIEW tasks_v AS
SELECT t.*
FROM tasks t
JOIN user_grants ug ON t.user_id = ug.user_id
AND ug.entity_name='TASKS' AND ug.entity_id = t.task_id;
当然,如果没有多个辅助函数,触发器和规则,设置就不完整。此外,有必要确保始终授予一些合理的默认权限。