PostgreSQL SELECT-RULES,继承,行级权限

时间:2013-02-09 16:27:41

标签: postgresql rules postgresql-9.2 row-level-security

以下是我一直在阅读的内容:

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

在表上实现行级安全性障碍需要哪些步骤?

2 个答案:

答案 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;

当然,如果没有多个辅助函数,触发器和规则,设置就不完整。此外,有必要确保始终授予一些合理的默认权限。