首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL RLS显式策略

PostgreSQL RLS显式策略
EN

Stack Overflow用户
提问于 2021-11-18 09:49:08
回答 1查看 88关注 0票数 1

从安全角度看,以下策略的实现是否等效?

隐含:

代码语言:javascript
复制
CREATE POLICY test_access_policy ON test 
  TO PUBLIC 
  USING (id = (current_setting('rls.id'::TEXT))) 
  WITH CHECK (TRUE);

明确:

代码语言:javascript
复制
CREATE POLICY test_insert_policy ON test 
  FOR INSERT TO PUBLIC
  WITH CHECK (TRUE);   

CREATE POLICY test_select_policy ON test
  FOR SELECT TO PUBLIC 
  USING (id = (current_setting('rls.id'::TEXT)));  

CREATE POLICY test_update_policy ON test 
  FOR UPDATE TO PUBLIC
  USING (id = (current_setting('rls.id'::TEXT)));   

CREATE POLICY test_delete_policy ON test 
  FOR DELETE TO PUBLIC 
USING (id = (current_setting('rls.id'::TEXT)));

我关心的是更新策略,如文档中所述

更新后的值不通过WITH CHECK表达式的任何行都将导致错误,整个命令将被中止。如果只指定了USING子句,那么该子句将用于USING和WITH。

据我理解,隐式版本(oneliner)的等效更新策略如下:

代码语言:javascript
复制
CREATE POLICY test_update_policy ON test 
  FOR UPDATE TO PUBLIC 
  USING (id = (current_setting('rls.id'::TEXT))) WITH CHECK (TRUE);

而明确的版本是:

代码语言:javascript
复制
CREATE POLICY test_update_policy ON test 
  FOR UPDATE TO PUBLIC 
  USING (id = (current_setting('rls.id'::TEXT))) WITH CHECK (id =
(current_setting('rls.id'::TEXT)));

在测试了这两种情况后,我没有发现任何安全桥,是不是遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-18 10:11:45

您的解释是正确的,您必须将WITH CHECK (TRUE)添加到FOR UPDATE策略中,才能有一个等效的定义。

不同之处在于,WITH CHECK (TRUE)允许您将值更改为任何值,如果新的行版本与条件不匹配,如果没有它,您将收到一个错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70017648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档