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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |