【问题标题】:Row level policy doesn't work on my table行级策略不适用于我的表
【发布时间】:2018-05-09 20:44:18
【问题描述】:

我有一个表,我正在尝试对其应用策略,设置如下所示:

create role anonymous nologin;
create schema api;
create schema private;
create table private.mytable(
    id  serial primary key,
    description text default ''
);
create view api.mytable as select * from private.mytable;
insert into api.mytable (description) values ('row 1'), ('row 2');
grant usage on schema api to anonymous;
grant select on api.mytable to anonymous;
alter table private.mytable enable row level security;
create policy mytable_policy on private.mytable
    for select
    using (null);

当我将角色设置为anonymous 并从mytable 中选择所有记录时:

set role anonymous;
select * from api.mytable;

我预计不会返回任何行,因为我在策略中的 using 子句中的表达式是 null,但我得到了一切。
我尝试了不同的postgresql 版本(9.5、9.6、10.3),但它们都有相同的行为,我在这里做错了吗?

【问题讨论】:

  • 使用using (false)是否有效?
  • 不,它没有。 @a_horse_with_no_name
  • 你在哪里试过?..真正的数据库还是一些小提琴?..
  • 我尝试连接到远程服务器并设置 postgres 的 docker 实例。 @VaoTsun
  • 试试alter view api.mytable owner to anonymous ;

标签: sql postgresql row-level-security


【解决方案1】:

更新

https://stackoverflow.com/a/33863371/5315974

RLS 不适用于这样的视图。您可以将 RLS 用于视图,尽管它是有限的。

你能做的是

alter view api.mytable owner to anonymous ;

【讨论】:

  • 使用您的确切命令我无法重现它,但请从问题中尝试我的脚本。我看到不同之处在于您使用 BEGIN 开始了事务,并且您在私有模式上授予匿名权限(我不想这样做)。
  • 我修正了错别字并添加了缺失的权限。其余的正是你的脚本 - 不是吗?..
  • 不,您在私有表而不是公共视图上进行了选择:select * from private.mytable;政策似乎也不适用于视图。
  • 哎呀!的确。现在我明白你的意思了:) 看这里然后stackoverflow.com/questions/33858030/…
  • 非常感谢您的帮助!
猜你喜欢
  • 2020-07-10
  • 2017-04-09
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2013-12-13
  • 2016-11-19
相关资源
最近更新 更多