在不同的所有者下创建数据库

Joh*_*han 8 postgresql security permissions

我正在尝试在 Postgres 中设置一个角色,它可以 a) 创建一个新角色 b) 创建一个新数据库 c) 使该新角色成为数据库的所有者 d) 没有其他权限(尽可能!)

我试过这个:

sc_1=# CREATE ROLE tenant_admin CREATEDB CREATEROLE;
CREATE ROLE
sc_1=# CREATE ROLE user1 IN ROLE tenant_admin LOGIN NOINHERIT ENCRYPTED PASSWORD 'xyz';
CREATE ROLE
sc_1=# 
Run Code Online (Sandbox Code Playgroud)

其次是(在另一个会话中)

tahaan@Komputer:~/projects/acme-project$ psql -U user1 -h localhost -d postgres
Password for user user1: 
psql (9.3.6)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

postgres=> SET ROLE tenant_admin;
SET                                                                                                                     
postgres=> CREATE DATABASE "Tenant1" TEMPLATE "tenant_template";
CREATE DATABASE
postgres=> CREATE ROLE "owner1";
CREATE ROLE
postgres=> ALTER DATABASE "Tenant1" OWNER TO "owner1";
ERROR:  must be member of role "owner1"
postgres=> 
Run Code Online (Sandbox Code Playgroud)

背景:要求具有可以在多租户系统中设置单独数据库的自动化功能。我希望这个功能可以由一个没有太多权限的角色来执行。

Joh*_*han 11

我找到了一个涉及一些额外步骤的解决方案。“tenant_admin”角色的创建方式仍然相同,但现在使用如下:

postgres=> SET ROLE tenant_admin;
SET                                                                                                                     
postgres=> CREATE ROLE "owner3";
CREATE ROLE
postgres=> GRANT "owner3" TO "tenant_admin";
GRANT ROLE
postgres=> CREATE DATABASE "Tenant3" OWNER "owner3";
CREATE DATABASE
postgres=> REVOKE "owner3" from "tenant_admin";
REVOKE ROLE
Run Code Online (Sandbox Code Playgroud)

  • 当我写这篇文章时,我正忙着自动化这个过程。许多名称都源自应用程序用户输入的内容。因此,一般来说,引用所有这些内容是个好主意。 (2认同)

小智 7

尝试创建新数据库时,RDS 遇到了这个问题。

要解决它:

以超级用户身份登录

psql --host=xxxxxxx --port=5432 --username=SUPERUSER_NAME --password --dbname=postgres
Run Code Online (Sandbox Code Playgroud)

创建用户

CREATE USER newuser WITH CREATEDB PASSWORD 'password';
Run Code Online (Sandbox Code Playgroud)

登出

\q
Run Code Online (Sandbox Code Playgroud)

登录为 newuser

psql --host=xxxxxxx --port=5432 --username=newuser --password --dbname=postgres
Run Code Online (Sandbox Code Playgroud)

创建您的数据库

CREATE DATABASE ....
Run Code Online (Sandbox Code Playgroud)