PostgreSQL 行安全策略不适用于 CREATE POLICY FOR UPDATE WITH CHECK (false);
PostgreSQL Row Security Policies is not working for CREATE POLICY FOR UPDATE WITH CHECK (false);
我正在尝试在某些 table 上设置行级安全性。到目前为止,我对 INSERT
和 SELECT
没有任何问题,现在正在尝试处理 UPDATE
.
我尝试了很多东西,但当我用 WITH CHECK (false)
定义策略时真的卡住了,尽管定义了策略,我仍然能够使用 rls 用户对 table 执行更新。
为什么会这样?我预计 table 的所有更新都会失败,因为 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.
您的策略使 rls_user
的 table 显示为空,因为它没有 USING
子句。
因此,UPDATE
永远不会修改行 (UPDATE 0
),并且由于没有行被修改,所以没有行必须通过 CHECK
条件并且不会抛出错误.
请注意,您授予用户 UPDATE
对 table 的权限,因此允许 运行 table 上的所有更新,只要修改行通过 CHECK
条件。
我正在尝试在某些 table 上设置行级安全性。到目前为止,我对 INSERT
和 SELECT
没有任何问题,现在正在尝试处理 UPDATE
.
我尝试了很多东西,但当我用 WITH CHECK (false)
定义策略时真的卡住了,尽管定义了策略,我仍然能够使用 rls 用户对 table 执行更新。
为什么会这样?我预计 table 的所有更新都会失败,因为 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.
您的策略使 rls_user
的 table 显示为空,因为它没有 USING
子句。
因此,UPDATE
永远不会修改行 (UPDATE 0
),并且由于没有行被修改,所以没有行必须通过 CHECK
条件并且不会抛出错误.
请注意,您授予用户 UPDATE
对 table 的权限,因此允许 运行 table 上的所有更新,只要修改行通过 CHECK
条件。