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

Cal*_*mer 18 sql postgresql views row-level-security postgresql-9.5

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

Lau*_*lbe 23

您可以从 PostgreSQL v15 开始执行此操作,它引入了security_invoker视图选项。如果您打开该功能,则会以调用视图的用户身份检查基础表的权限,并使用调用用户的 RLS 策略。

您可以使用以下命令更改现有视图

ALTER VIEW view_name SET (security_invoker = on);
Run Code Online (Sandbox Code Playgroud)

  • 如果有人也需要它,命令是 CREATE OR REPLACE VIEW "SomeView" WITH (security_invoker=on) AS SELECT ... (3认同)

Cra*_*ger 20

基本上是因为不可能追溯性地改变视图的工作方式.我希望能够支持SECURITY INVOKER(或等效)视图,但据我所知,目前还没有这样的功能.

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

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

如果你愿意介入并帮助开发你需要的功能,或者pgsql-general,也许值得在pgsql-hackers上提高这一点?

也就是说,虽然视图将表作为创建用户进行访问并相应地进行更改current_user,但它们并不会阻止您session_user在行安全策略中使用自定义GUC ,或其他上下文信息.您可以将行安全性与视图一起使用,而不是(有用)基于此进行过滤current_user.

  • 哇..这真的需要在政策文档页面中提到.我刚刚在我们的应用程序中发现了这个问题,其中所有表都在私有模式中找到,并且它们仅通过不同模式中的视图提供给外部API.因为这个视图是由超级用户创建的,所以即使RLS已经过测试并且在真实表格上运行良好,RLS也完全被破坏了. (8认同)
  • @Calebmer 查看视图使用的访问表,并具有创建视图的用户的访问权限。为了允许行安全性基于访问视图的“顶级”用户有效地过滤对通过视图访问的表的访问,需要更改视图访问视图中表的方式,以便不设置 `current_user`,等等。我们有`session_user`,但是当你`SET SESSION AUTHORIZATION` 时它不会改变,所以如果你通过 pgbouncer 或类似的方式使用池连接,它是没有用的。 (2认同)

小智 9

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

WHERE my_security_policy_function(person_id)
Run Code Online (Sandbox Code Playgroud)