我需要严格控制Postgres数据的读写。可更新视图一直以来都能很好地提供对我的数据的严格控制,并允许我添加有价值的计算列。随着Postgres 9.5行级安全性的引入,出现了一种新而强大的控制数据的方式。但是我无法同时使用这两种技术-视图和行级安全。为什么?
我需要严格控制Postgres数据的读写。可更新视图一直以来都能很好地提供对我的数据的严格控制,并允许我添加有价值的计算列。随着Postgres 9.5行级安全性的引入,出现了一种新而强大的控制数据的方式。但是我无法同时使用这两种技术-视图和行级安全。为什么?
编辑:正如下面另一条回复提到的那样,自从PostgreSQL 15版本以来,视图可以通过使用security_invoker
标志继承其原始表的RLS策略(https://www.postgresql.org/docs/15/sql-createview.html)
SECURITY INVOKER
(或等效)进行支持。据我所知,目前没有这样的功能。current_user
视为视图创建者,因为视图以创建/拥有视图的用户的权限访问表(和其他视图)。current_user
,但它们不会阻止您使用自定义GUC、session_user
或其他上下文信息来进行行安全性策略。您可以在视图中使用行安全性,只是不能(有用地)基于current_user
进行过滤。current_user
等。我们有session_user
,但是如果您通过pgbouncer或类似工具使用池化连接,则不会更改它,因此它没有用处。 - Craig RingerSECURITY INVOKER
,请参见https://www.postgresql.org/docs/current/sql-createfunction.html。 - Alex从PostgreSQL v15开始,您可以使用视图上的security_invoker
选项实现此操作。如果打开该选项,则会将基础表的权限检查为调用视图的用户,并使用调用用户的RLS策略。
您可以使用以下方法更改现有视图:
ALTER VIEW view_name SET (security_invoker = on);
行级安全策略仍然可以应用于视图的 WHERE
子句中,例如:
WHERE my_security_policy_function(person_id)