为什么不为 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 策略。
我需要严格控制我的 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 策略。