search_path 是否会在运行时影响 RLS 策略定义?
Are RLS policy definitions affected at runtime by the search_path?
在回答 时,我对
提出了一些(毫无根据的)建议
create policy test_policy on policy for all to public using (
user_id = session_user_id());
Btw, you should schema-qualify the session_user_id()
call to make your policy actually secure, so that the user cannot inject their own session_user_id
function through the search_path
.
但事实真的如此吗?我记错了the search_path
issue with SECURITY DEFINER
functions.
如何以及何时解析行级安全策略?引用是在定义期间还是在评估期间解析的?
将其中的标识符设置为早期绑定而不是后期绑定是有意义的,但我在文档中找不到任何关于此的内容。
策略定义存储在 pg_policy
中,其中 USING
子句存储在 polqual
列中,WITH CHECK
表达式存储在 polwithcheck
中.
两列都是数据类型pg_node_tree
,这是一个解析的SQL语句。因此策略在创建时被解析,而不是在执行时被解析,这很像视图或符合标准的 SQL 函数(v14 中的新功能)。这意味着 search_path
的设置仅在创建策略时相关,而不是在执行时相关。
在回答
create policy test_policy on policy for all to public using (
user_id = session_user_id());
Btw, you should schema-qualify the
session_user_id()
call to make your policy actually secure, so that the user cannot inject their ownsession_user_id
function through thesearch_path
.
但事实真的如此吗?我记错了the search_path
issue with SECURITY DEFINER
functions.
如何以及何时解析行级安全策略?引用是在定义期间还是在评估期间解析的?
将其中的标识符设置为早期绑定而不是后期绑定是有意义的,但我在文档中找不到任何关于此的内容。
策略定义存储在 pg_policy
中,其中 USING
子句存储在 polqual
列中,WITH CHECK
表达式存储在 polwithcheck
中.
两列都是数据类型pg_node_tree
,这是一个解析的SQL语句。因此策略在创建时被解析,而不是在执行时被解析,这很像视图或符合标准的 SQL 函数(v14 中的新功能)。这意味着 search_path
的设置仅在创建策略时相关,而不是在执行时相关。