PostgreSQL行安全策略不适用于创建带有检查的更新策略假;

问题描述

我正在尝试在某些表上设置行级安全性。到目前为止,我对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. 

解决方法

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...