Postgres CREATEROLE限制为特定的db

时间:2017-07-30 17:51:58

标签: postgresql

在Postgres中,我如何创建具有CREATEROLE - 权限的用户,但仅限于特定的DB / DB集?

我尝试过:

CREATE ROLE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATEROLE;

这是对的吗? +如何将CREATEROLE授予多个数据库?

2 个答案:

答案 0 :(得分:4)

角色由数据库群集创建,根据doc而不是数据库。如果您将这个强大的权利赋予用户,他将能够创建可在群集的每个数据库中使用的角色。

由于您需要为角色授予权限,因此可以确保将来自单个数据库的内容分配给该角色。

答案 1 :(得分:2)

似乎这不是一个简单的方法。但您可以使用<script type="module">选项创建函数以实现所需的行为:

security definer

以超级用户身份创建此功能。

然后,您可以使用create or replace function fn_create_role(p_name text, p_password text, p_databases text[]) returns void language plpgsql security definer as $$ begin execute format('create role %I with login password %L;', p_name, p_password); execute format('grant connect on database %s to %I', array_to_string(p_databases, ','), p_name); return; end $$; 选项创建角色,但为此功能授予NOCREATEROLE权限,并使用它创建其他角色。

注意:您需要从特定数据库的EXECUTE角色撤消connect选项,以禁止默认情况下角色连接到它们,例如:

public

测试它:

作为超级用户(在我的情况下revoke connect on database db1, db2 from public; ,也拥有同名的架构)

nd

在终端:

$ psql -h localhost -d db1 -U win
Password for user win: 
psql (9.6.3)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

win@db1=> \q
$ psql -h localhost -d db2 -U win
Password for user win: 
psql: FATAL:  permission denied for database "db2"
DETAIL:  User does not have CONNECT privilege.