Postgres:授予角色/用户访问权限,以便将来由其他角色/用户创建的表

时间:2019-10-03 12:32:30

标签: postgresql spring-boot migration flyway

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

我决定使用两个不同的角色: role__app (表的读/写权限, 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__app app.property <没有任何权限/ strong>表:

enter image description here


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

1 个答案:

答案 0 :(得分:1)

您应该写

ALTER DEFAULT PRIVILEGES FOR USER role__migration ...

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

使用以上语句,在role__migration创建对象时授予特权。 not 不会扩展到角色role__migration的成员。