PostgreSQL: 通过角色赋权

在开始话题之前,先讲解下 PostgreSQL 里的用户和角色的一些知识,在 PostgreSQL 里没有区分用户和角色的概念,CREATE USERCREATE ROLE 的别名,这两个命令几乎是完全相同的,唯一的区别是”CREATE USER”命令创建的用户的 LOGIN 属性默认为 on , 而 CREATE ROLE 命令创建的用户的 NOLOGIN 属性默认为 on。

在 Oracle 里,可以通过角色赋权,例如新建一个用户后,可以把 connect ,RESOURCE 等角色赋给新建的用户,在PostgreSQL 里也可以实现通过角色赋权,PostgreSQL 是通过角色继承的方式实现,下面看下具体实现过程。

创建 CP 角色

创建角色和创建用户的语法一样,如下创建 CP 角色。

1
2
postgres=# create role cp login nosuperuser nocreatedb nocreaterole noinherit encrypted password 'cp';  
CREATE ROLE

给 CP 角色赋权

给 CP 用户赋予数据库 skytf 连接权限和相关表的查询权限

1
2
3
4
5
6
7
8
9
10
11
postgres=# grant connect on database skytf to cp;  
GRANT

postgres=# /c skytf skytf;
You are now connected to database "skytf" as user "skytf".

skytf=> grant usage on schema skytf to cp;
GRANT

skytf=> grant select on skytf.test_1 to cp;
GRANT

创建用户 cp_1

1
2
3
4
5
6
skytf=> /c postgres postgres  
You are now connected to database "postgres" as user "postgres".

postgres=# create role cp_1 login nosuperuser nocreatedb nocreaterole inherit encrypted password 'cp_1';
CREATE ROLE
备注:这里创建 cp_1 用户,并开启 inherit 属性。

将 cp 角色赋给 cp_1 用户

方法一

1
2
skytf=# grant cp to cp_1;  
GRANT ROLE

方法二

1
2
postgres=# create role cp_2 login nosuperuser nocreatedb nocreaterole inherit encrypted password 'cp_2' in role cp;  
CREATE ROLE

备注:上面提供了两种方法将 cp 角色的权限赋给其它用户,第二种方法是在创建用户时即赋予了角色权限。

测试 cp_1 用户的权限

1
2
3
4
5
6
7
skytf=# /c skytf cp_1;  
You are now connected to database "skytf" as user "cp_1".

skytf=> select * from skytf.test_1 limit 1;
id
----
(0 rows)

查询角色、用户信息

1
2
3
4
5
6
postgres=# /du  
Role name | Attributes | Member of
------------------+---------------------------------------------------+-----------
cp | No inheritance | {}
cp_1 | | {cp}
cp_2 | | {cp}

备注:/du 命令显示用户信息, “ Member of “ 项表示 cp_1, cp_2 用户属于 cp 用户组。

附 CREATE ROLE 语法

CREATE ROLE
Name
CREATE ROLE – define a new database role
Synopsis
CREATE ROLE name [ [ WITH ] option [ … ] ]
where option can be:
SUPERUSER | NOSUPERUSER
| CREATEDB | NOCREATEDB
| CREATEROLE | NOCREATEROLE
| CREATEUSER | NOCREATEUSER
| INHERIT | NOINHERIT
| LOGIN | NOLOGIN
| CONNECTION LIMIT connlimit
| [ ENCRYPTED | UNENCRYPTED ] PASSWORD ‘password’
| VALID UNTIL ‘timestamp’
| IN ROLE role_name [, …]
| IN GROUP role_name [, …]
| ROLE role_name [, …]
| ADMIN role_name [, …]
| USER role_name [, …]
| SYSID uid Description

原创文章,作者:bd101bd101,如若转载,请注明出处:https://blog.ytso.com/237810.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论