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
。我必须走多远才能执行这个看似简单的任务?如果我直接向该用户授予这些表上的 INSERT
、UPDATE
、DELETE
权限,那就达不到目的了。
授予用户 EXECUTE
函数权限难道不应该允许它在该函数范围内执行任何操作吗?
首先让我说一下,令我惊讶的是有多少人认为这是使用函数进行数据修改的最佳方式。除了 PL/pgSQL 函数缓存计划(您也可以使用准备好的语句)这一事实,我不明白这一点。
除非万不得已,否则您绝不应该为任何事情使用超级用户权限,这是不必要的,而且会带来安全问题。
为了描述我的建议,请使用三个(正常!)用户 a
、b
和 c
:
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
可以执行的所有操作.
我无法理解 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
。我必须走多远才能执行这个看似简单的任务?如果我直接向该用户授予这些表上的 INSERT
、UPDATE
、DELETE
权限,那就达不到目的了。
授予用户 EXECUTE
函数权限难道不应该允许它在该函数范围内执行任何操作吗?
首先让我说一下,令我惊讶的是有多少人认为这是使用函数进行数据修改的最佳方式。除了 PL/pgSQL 函数缓存计划(您也可以使用准备好的语句)这一事实,我不明白这一点。
除非万不得已,否则您绝不应该为任何事情使用超级用户权限,这是不必要的,而且会带来安全问题。
为了描述我的建议,请使用三个(正常!)用户 a
、b
和 c
:
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
可以执行的所有操作.