Postgres:为不同角色/用户创建的未来表授予对角色/用户的访问权限

Posted

技术标签:

【中文标题】Postgres:为不同角色/用户创建的未来表授予对角色/用户的访问权限【英文标题】:Postgres: granting access to a role/user for future tables created by a different role/user 【发布时间】:2020-02-01 18:38:53 【问题描述】:

我正在构建一个 Spring Boot 应用程序。 Flyway 数据库迁移在应用程序启动时执行。

我决定使用两个不同的角色:role__appread/write 对表的权限,app 架构中的序列)和 role__migration应用程序/迁移架构中的高级权限)。

Flyway 迁移在 role__migration 下执行,因此它成为创建对象的所有者。我认为以下陈述会有所帮助:

ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO role__app;
ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT USAGE ON SEQUENCES TO role__app;

但是当新表添加到 app 架构时,user__app(属于 role__app)无法访问表格。

是否可以通过 Postgres 或任何其他方式维持这样的流程(通过应用程序、迁移用户/角色)?


作为旁注,我应该提到我在目标数据库上运行以下语句:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE myDb FROM PUBLIC;

更新 1

我添加了 FOR ROLE 子句,但我仍然收到用户 user__app 的应用架构中创建的表 (app.property) 的权限被拒绝消息.表的所​​有者是 user__mig

更新 2

在 dbeaver 中以 postgres 用户身份登录后,我们可以看到 user__mig 已勾选所有必要的权限,而 user__appapp.property 表:


这里是重现问题的要点:https://gist.github.com/happygrizzly/849a6a791f028ba5b191f73180ae35d1

【问题讨论】:

您是否将架构应用的使用权限授予 role_app? @Jeremy 是的,我做到了 【参考方案1】:

你应该写

ALTER DEFAULT PRIVILEGES FOR USER role__migration ...

如果您省略FOR USER 子句,则权限仅授予运行ALTER DEFAULT PRIVILEGES 的用户创建的对象。

通过上面的语句,当role__migration创建一个对象时,权限被授予。这不会扩展到role__migration 角色的成员。

【讨论】:

一定要写FOR USER,可以用FOR ROLE代替吗? 最初我按照the article at amazon 中的示例进行操作。我已阅读您的编辑,现在了解有关直接 角色 及其权限的内容。代表团。我看到了使用多个用户的意义,因为它们代表不同的登录。关于迁移流程,我大概可以使用单一迁移登录(role__migration + WITH LOGIN)。 很好。看起来问题已得到解答。

以上是关于Postgres:为不同角色/用户创建的未来表授予对角色/用户的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

授予对 Postgres 中所有表的访问权限

PostgreSQL - 在*所有模式*中授予对所有表(和未来表)的选择

Postgres:即使授予了授权,也拒绝架构的权限

Postgres和MySQL创建用户并授予db权限

oracle 创建表空间并授予用户角色

如何授予 SQL 角色权限以创建和管理临时表