2013-02-09 25 views
2

这就是我一直在读:PostgreSQL的SELECT规则,继承,行级权限

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中这样的事,作为一个架构级的选择规则,影响模式所有表和视图,即追加到每一个选择,插入,更新或删除声明说,在,..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

我试图创建一个视图安全 - 屏障

 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.` 

实现对表的行级安全性障碍,需要哪些步骤?

回答

2

在你的最后一个例子,你需要运行INSERT对阵表或创建另一个规则:ON INSERT TO TENANTFOO DO INSTEAD

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; 

当然,如果没有许多辅助函数,触发器和规则,安装程序是不完整的。还有必要确保总是授予一些合理的默认权限。