【问题标题】:What is the idiomatic way of having PUBLIC and PRIVATE FUNCTIONS in Postgresql?在 Postgresql 中拥有 PUBLIC 和 PRIVATE FUNCTIONS 的惯用方式是什么?
【发布时间】:2021-12-16 09:51:19
【问题描述】:

我在空闲时间在 supabase(PG 13.3) 中开发 PoC,虽然我将主要功能分解为更小的功能(出于重用目的),但我希望应用程序/客户端只能访问其中的三个它们(“公共”功能)。所以大部分功能只被这三个主要功能使用。

考虑到托管解决方案(RDS 或 Google Cloud SQL),限制对应用程序/客户端的访问仅限于这三个功能并阻止它们查看和执行其他“私有”功能的最佳方法是什么。

我用谷歌搜索了它,但还没有找到答案。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 数据库中没有“公共”和“私有:”函数、表或视图。通过权限控制对特定对象的访问。如果您不希望用户访问某些功能,请不要授予这些权限。不要创建可以查看所有内容的帐户
  • 谢谢@PanagiotisKanavos,这对我来说很有意义。我想知道阻止对 sub_functionA 的访问并授予对 FunctionA(使用 sub_functiona)的访问权限是否会导致问题。
  • 在此处搜索 SECURITY DEFINER CREATE FUNCTION

标签: postgresql plpgsql supabase supabase-database


【解决方案1】:

您可以采取两种方法:

  1. 将您不希望用户使用的辅助功能放在不在search_path 上的不同架构中,并且不要记录它们。

    那么它们只能用不同的模式限定来调用,所以它们不会被意外调用。但是,这并不能阻止用户使用这些功能,只是不鼓励他们。

  2. REVOKE 对来自PUBLIC 的辅助功能的权限,并且仅将其授予主要功能的所有者。然后将这些主要函数声明为SECURITY DEFINER(并确保为set search_path on them!)。

    这种方法的主要缺点是所有函数都以所有者身份执行,因此您不能使用 PostgreSQL 的正常权限检查来确保调用者不会访问任何它没有权限的数据。

我个人更喜欢第一种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-21
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2010-10-11
    • 2023-01-08
    相关资源
    最近更新 更多