加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – Postgres CREATEROLE对特定数据库的限制

发布时间:2020-12-13 16:02:49 所属栏目:百科 来源:网络整理
导读:在Postgres中,如何创建具有CREATEROLE权限的用户,但仅限于特定的DB / DB集? 我试过做: CREATE ROLE user WITH LOGIN PASSWORD 'password' NOCREATEDB CREATEROLE; 它是否正确?如何将CREATEROLE授予多个数据库? 解决方法 似乎这不是一个简单的方法.但您可
在Postgres中,如何创建具有CREATEROLE权限的用户,但仅限于特定的DB / DB集?

我试过做:

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

它是否正确?如何将CREATEROLE授予多个数据库?

解决方法

似乎这不是一个简单的方法.但您可以使用安全定义器选项创建功能以实现所需的行为:

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特权,并使用它来创建其他角色.

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

revoke connect on database db1,db2 from public;

测试一下:

作为超级用户(在我的情况下,nd也拥有同名的架构)

postgres=# create database db1; create database db2;
CREATE DATABASE
CREATE DATABASE
postgres=# revoke connect on database db1,db2 from public;
REVOKE
postgres=# create role foo with login password 'bar' nocreatedb nocreaterole;
CREATE ROLE
postgres=# set role foo;
SET
postgres=> create role win with login password 'amp' nocreatedb nocreaterole;
ERROR:  permission denied to create role
postgres=> set role nd;
SET
postgres=# grant usage on schema nd to foo;
GRANT
postgres=# grant execute on function nd.fn_create_role(text,text,text[]) to foo;
GRANT
postgres=# set role foo;
SET
postgres=> select nd.fn_create_role('win','amp','{db1}');
┌────────────────┐
│ fn_create_role │
╞════════════════╡
│                │
└────────────────┘
(1 row)

在终端:

$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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读