【问题标题】:PostgreSQL Row Security Policies is not working for CREATE POLICY FOR UPDATE WITH CHECK (false);PostgreSQL 行安全策略不适用于 CREATE POLICY FOR UPDATE WITH CHECK (false);
【发布时间】:2020-12-01 10:55:55
【问题描述】:

我正在尝试在某些表上设置行级安全性。到目前为止,我对 INSERTSELECT 没有任何问题,现在正在尝试处理 UPDATE

我尝试了很多方法,但当我使用 WITH CHECK (false) 定义策略时确实卡住了,尽管定义了策略,我仍然能够使用 rls 用户在该表上执行更新。

为什么会这样?我预计该表上的所有更新都会失败,因为WITH CHECK 是一个布尔验证器。

这是我的代码:

CREATE TABLE t (
                "id" SERIAL PRIMARY KEY NOT NULL, 
                "name" varchar (50) NOT NULL
               );
create role rls_user NOINHERIT;
GRANT USAGE ON SCHEMA public TO rls_user;

GRANT SELECT, UPDATE, INSERT ON ALL TABLES IN SCHEMA public TO rls_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO rls_user;

alter table t enable row level security;

CREATE POLICY t_update ON t
FOR UPDATE WITH CHECK (false);

----> CREATE POLICY t_update ON t
----> FOR UPDATE USING (false); ---> also doesn't work
set role rls_user;

UPDATE t 
SET name = 'blabla'
WHERE "id" = 1;

---> expected: UPDATE FAILED

---> result: 
--->           UPDATE 0

--->           Query returned successfully in 73 msec. 

【问题讨论】:

    标签: sql postgresql row-level-security


    【解决方案1】:

    您的策略使rls_user 的表显示为空,因为它没有USING 子句。

    因此,UPDATE 永远不会修改行(UPDATE 0),并且由于没有行被修改,因此没有行必须通过CHECK 条件并且不会引发错误。

    请注意,您授予用户UPDATE 对表的权限,因此只要修改的行通过CHECK 条件,就可以对表运行所有更新。

    【讨论】:

    • 谢谢!当我看到Query returned successfully 时,我认为该策略不起作用,我预计会出现错误。我没有注意到UPDATE 0 中的零。
    猜你喜欢
    • 2018-04-30
    • 2019-01-11
    • 2021-08-07
    • 2020-10-30
    • 1970-01-01
    • 2019-09-24
    • 2022-01-03
    • 1970-01-01
    • 2022-07-07
    相关资源
    最近更新 更多