Postgres 权限

Postgres Permissions

我无法理解 PostgreSQL 中的权限。

例如我有一个用户 webapiuser 的 Web 应用程序。这个用户是有限的,因为它只能通过某种功能来操作数据库。这意味着没有直接的数据库 CRUD 操作,只能通过上帝 postgres 用户创建的函数,并且只能在其自己的 中运行。我已经完成了各种阅读,许多教程指向向每个函数添加 SECURITY DEFINER,但是这个 允许 函数所有者代表用户执行的函数这违背了我理解的目的;毕竟我正在尝试锁定这种访问权限。

我已经创建了一个用户:

CREATE USER webapiuser WITH PASSWORD <password>;

并授予 USAGE 所有模式:

GRANT USAGE ON SCHEMA schemaA TO webapiuser;
GRANT USAGE ON SCHEMA schemaB TO webapiuser;
GRANT USAGE ON SCHEMA poublic TO webapiuser;

我试过添加:

GRANT EXECUTE ON FUNCTION schemaA.func_myfunction() TO webapiuser;

但后来我遇到了 permission denied for view view_my_view。该函数从该视图执行 select 所以我猜 GRANT 命令正在工作。如果我执行执行插入操作的函数,我会收到类似的错误 permission denied for table my_table。我必须走多远才能执行这个看似简单的任务?如果我直接向该用户授予这些表上的 INSERTUPDATEDELETE 权限,那就达不到目的了。

授予用户 EXECUTE 函数权限难道不应该允许它在该函数范围内执行任何操作吗?

首先让我说一下,令我惊讶的是有多少人认为这是使用函数进行数据修改的最佳方式。除了 PL/pgSQL 函数缓存计划(您也可以使用准备好的语句)这一事实,我不明白这一点。

除非万不得已,否则您绝不应该为任何事情使用超级用户权限,这是不必要的,而且会带来安全问题。

为了描述我的建议,请使用三个(正常!)用户 abc

  • a 是架构 appschema 和该架构中的数据库对象的所有者,即 a 用于创建它们。 a 将对象的所有必要权限授予 b,但 none 授予 c

  • b 拥有一组 SECURITY DEFINER 函数,这些函数对 appschema 中的表执行数据修改。 b 撤销了 PUBLIC 对这些函数的 EXECUTE 权限,仅授予 c

    重要的是所有这些函数都用SET search_path = appschema定义。

  • c 是应用程序使用的用户。除了 b 函数的 EXECUTE 权限外,该用户没有超出连接数据库权限的权限。

现在当c执行任何功能时,它们将运行与b的用户上下文,也就是说,它们可以执行b可以执行的所有操作.