在回答这个问题时,我给出了一些(没有根据的)建议
create policy test_policy on policy for all to public using (
user_id = session_user_id());
顺便说一句,您应该对
session_user_id()
调用进行模式限定,以使您的策略真正安全,这样用户就不能通过search_path
注入自己的session_user_id
函数。
但事实是这样吗?我把SECURITY DEFINER
函数的search_path
问题记错了。
如何以及何时解析行级安全策略?在定义或求值期间是否解决了引用?
让它们中的标识符是早绑定而不是晚绑定是有意义的,但我在文档中找不到任何关于这一点的内容。
策略定义存储在pg_policy
中,USING
子句存储在polqual
列中,WITH CHECK
表达式存储在polwithcheck
中。
两个列的数据类型为pg_node_tree
,这是一个已解析的SQL语句。因此,策略在创建时解析,而不是在执行时解析,这很像视图或符合标准的SQL函数(v14中的新功能)。这意味着search_path
的设置只在创建策略时相关,而在执行策略时无关。