3

这是我一直在阅读的内容:

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

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

4

2 回答 2

2

在您的最后一个示例中,您需要INSERT 对表运行或创建另一个 RULE: ON INSERT TO TENANTFOO DO INSTEAD

于 2013-02-09T22:50:04.160 回答
1

您正在寻找的是Row-Level Security,它尚不可用,尽管已经在这件事上做了一些工作。我希望这个补丁能在即将到来的 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;

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

于 2013-02-09T23:15:12.123 回答