为什么不为 Postgres 视图启用行级安全性?

Why isn't row level security enabled for Postgres views?

我需要严格控制我的 Postgres 数据的读写。可更新视图始终提供非常好的、严格的数据读取控制,并允许我添加有价值的计算列。在 Postgres 9.5 中,行级安全性引入了一种新的强大方式来控制我的数据。但我不能同时使用这两种技术视图和行级安全性。为什么?

主要是因为无法追溯更改视图的工作方式。我希望能够支持 SECURITY INVOKER(或等效)视图,但据我所知目前不存在此类功能。

您可以正常使用行安全性过滤对视图自身的访问。

视图访问的表也将应用它们的行安全规则。但是,他们会将 current_user 视为 视图创建者 ,因为视图访问表(和其他视图)具有 created/owns 视图用户的权限。

如果您愿意介入并帮助开发您需要的功能,或者 pgsql-general 否则,也许值得在 pgsql-hackers 上提出这个问题?

也就是说,虽然以创建用户的身份查看访问表并相应地更改 current_user,但它们不会阻止您使用自定义 GUC、session_user 或行安全性中的其他上下文信息政策。您可以将行安全性与视图一起使用,只是不能(有用地)基于 current_user.

进行过滤

行级安全策略仍然可以在视图的 WHERE 子句中应用。例如:

WHERE my_security_policy_function(person_id)

您可以从 PostgreSQL v15 开始执行此操作,它在视图上引入了 security_invoker 选项。如果打开它,将检查基础表的权限作为调用视图的用户,并使用调用用户的 RLS 策略。