如何解决PostgreSQL行安全策略不适用于创建带有检查的更新策略假;
我正在尝试在某些表上设置行级安全性。到目前为止,我对INSERT
和SELECT
没问题,现在尝试处理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
条件,就可以在表上运行所有更新。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。