rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolconnlimit ---------+----------+------------+---------------+-------------+--------------+-------------+-------------- s1 | t | t | f | f | t | t |-1
# 查看 s1 用户创建的数据库 test=# select datname,rolname from pg_database,pg_roles where pg_database.datdba = pg_roles.oid and pg_roles.rolname='s1' ;
datname | rolname ---------+--------- s1_db | s1
注意:
在查看用户权限的时候 s1 用户是没有 创建数据库与创建角色权限的,为什么能够创建成功呢?
原因是 s1 用户是 super 角色 ,super 用户的创建数据库与角色是不受 nocreateuser 、nocreatedb 限制的。
2.3.2 创建普通用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
# 创建普通角色,不给登录权限(没有登录权限的用户只能称为角色,有了登录权限之后才能被称之为用户) test=# createuser s1_u1 with nologin password '123456'; NOTICE: resource queue required -- using default resource queue "pg_default" # 使用默认队列 CREATE ROLE # 创建成功
-- 查看 s1_u1 角色与权限 test=# select rolname,rolsuper,rolinherit,rolcreaterole,rolcreatedb,rolcatupdate,rolcanlogin,rolconnlimit,rolvaliduntil from pg_roles where rolname ='s1_u1'; rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcatupdate | rolcanlogin | rolconnlimit | rolvaliduntil ---------+----------+------------+---------------+-------------+--------------+-------------+--------------+--------------- s1_u1 | f | t | f | f | f | f |-1|
-- 查看 s1_u1 角色与权限 test=# \duS+ s1_u1 List of roles Role name | Attributes |Memberof| Description -----------+--------------+-----------+------------- s1_u1 | Cannot login | {} |
2.3.3 用户登录权限测试
编辑登录配置文件
1 2 3 4 5 6
vim /data/master/gpseg-1/pg_hba.conf
host test s1_u1 192.168.71.100/32 md5
# 编辑完成之后 使用 gpstop -u 命令 更新配置 gpstop -u
登录用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 使用 s1_u1 用户登录 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test could not change directory to "/root": 权限不够 Password foruser s1_u1: psql: FATAL: role "s1_u1" isnot permitted to log in # 提示没有登录权限
# 使用 super 用户给 s1_u1 用户赋予登录权限 test=# alter role s1_u1 login; ALTER ROLE
# 在新的窗口登录 s1_u1 用户 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test Password foruser s1_u1: psql (9.4.24) Type "help" for help.
# 使用 s1_u1_u1 用户查看创建的数据库 test=> \l s1_u1_u1_db List of databases Name | Owner | Encoding |Collate| Ctype | Access privileges -------------+----------+----------+------------+------------+------------------- s1_u1_u1_db | s1_u1_u1 | UTF8 | en_US.utf8 | en_US.utf8 | # 使用 s1_u1 用户,删除 s1_u1_u1 用户, 无法删除 test=>drop role s1_u1_u1; ERROR: permission denied todrop role
# 使用 super 用户,删除 s1_u1_u1 用户, 因为 s1_u1_u1 用户拥有 数据库资源,所以该用户不能被删掉 test=# drop role s1_u1_u1; ERROR: role "s1_u1_u1" cannot be dropped because some objects depend on it DETAIL: owner of database s1_u1_u1_db
测试用户删除子用户创建的资源
1 2 3 4 5 6 7
# 使用 s1_u1 用户,删除 s1_u1_u1 用户创建的 s1_u1_u1_db 数据库 test=>drop database s1_u1_u1_db; ERROR: must be owner of database s1_u1_u1_db; # 提示进行这个操作的必须是 s1_u1_u1_db 的 拥有者
# 使用 super 用户,删除s1_u1_u1 用户创建的 s1_u1_u1_db 数据库,删除成功 test=# drop database s1_u1_u1_db; DROP DATABASE
# 创建 第一个 s1_u1 连接 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test Password foruser s1_u1: psql (9.4.24) Type "help" for help.
test=> # 创建 第二个 s1_u1 连接 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test could not change directory to "/root": 权限不够 Password foruser s1_u1: psql (9.4.24) Type "help" for help.
test=>
# 创建 第三个 s1_u1 连接 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test could not change directory to "/root": 权限不够 Password foruser s1_u1: psql (9.4.24) Type "help" for help.
test=>
# 退出上面所有的用户
# 使用 super 用户将 s1_u1 连接数设置为 2 alter role s1_u1 connection limit 2
# 再次创建 第一个 s1_u1 连接 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test Password foruser s1_u1: psql (9.4.24) Type "help" for help.
test=> # 再次创建 第二个 s1_u1 连接 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test could not change directory to "/root": 权限不够 Password foruser s1_u1: psql (9.4.24) Type "help" for help.
test=>
# 再次创建 第三个 s1_u1 连接 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U s1_u1 -d test Password foruser s1_u1: psql: FATAL: too many connections for role "s1_u1" # 并未登陆成功,提示连接数过多
# 只在配置文件中配置 连接 test 库 host test gpadmin_u1 192.168.71.100/32 md5
# 重新加载配置文件 gpstop -u
4.1 测试 connect 权限
连接配置文件中未配置的数据库
1 2 3 4 5 6 7 8 9
# 连接 test 数据库 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U gpadmin_u1 -d test Password foruser gpadmin_u1: psql (9.4.24) Type "help" for help.
# 查看登录信息 test=> \conninfo You are connected to database "test" asuser "gpadmin_u1" on host "192.168.71.100" at port "5432".
直接登录 (连接失败)
1 2 3 4
# 使用 gpadmin_u1 连接 gpadmin_db 数据库, 连接失败 test=> \c gpadmin_db FATAL: no pg_hba.conf entry for host "192.168.71.100", user "gpadmin_u1", database "gpadmin_db", SSL off Previous connection kept
使用 super 用户 赋予 gpadmin_u1 连接 gpadmin_db 的权限 (连接失败)
1 2 3 4 5 6 7
# 使用 super 用户 赋予 gpadmin_u1 连接 gpadmin_db 的权限 grantconnecton database gpadmin_db to gpadmin_u1;
# 再次 使用 gpadmin_u1 连接 gpadmin_db 数据库, 依然连接失败 test=> \c gpadmin_db FATAL: no pg_hba.conf entry for host "192.168.71.100", user "gpadmin_u1", database "gpadmin_db", SSL off Previous connection kept
修改配置文件, 赋予 gpadmin_u1连接 gpadmin_db 的权限 (连接成功)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# 修改配置文件,给 gpadmin_u1 赋予 连接 gpadmin_db 的权限 vim /data/master/gpseg-1/pg_hba.conf
# 只在配置文件中配置 连接 test 库 host test gpadmin_u1 192.168.71.100/32 md5
# 重新加载配置文件 gpstop -u
# 使用 gpadmin_u1 连接 gpadmin_db 数据库 test=> \c gpadmin_db You are now connected to database "gpadmin_db" asuser "gpadmin_u1". \conninfo You are connected to database "gpadmin_db" asuser "gpadmin_u1" on host "192.168.71.100" at port "5432".
撤销 gpadmin_u1连接 gpadmin_db 的权限
1 2 3 4 5 6 7 8 9 10
# 撤销连接权限 postgres=# REVOKEconnecton database gpadmin_db from gpadmin_u1; REVOKE
# # 使用 gpadmin_u1 连接 gpadmin_db 数据库, 依然可以连接成功 test=> \c gpadmin_db You are now connected to database "gpadmin_db" asuser "gpadmin_u1".
\conninfo You are connected to database "gpadmin_db" asuser "gpadmin_u1" on host "192.168.71.100" at port "5432".
总结
只要在配置文件中配置用户连接到某个数据库的权限, 用户就可以到指定连接到指定数据库
如果未在配置文件中配置连接权限, 而只用 connect 赋予权限, 用户并不能连接到指定数据库
在配置文件中配置用户连接到某个数据库的权限后, 使用 REVOKE connect on database ... 并不能回收用户连接数据库的权限
# 查看当前库有哪些表 \d List of relations Schema | Name | Type | Owner | Storage ---------------+-----------------+-------+------------+--------- pg_temp_51292 | temp_gpadmin_u1 |table| gpadmin_u1 | heap (1row)
# 插入数据 insert into temp_gpadmin_u1 values(1,'xiaoming'); INSERT01
# 查询数据 select*from temp_gpadmin_u1; id | name ----+---------- 1| xiaoming
退出会话,重新登录查看临时表
1 2 3 4 5 6 7 8 9 10 11
# 退出会话 \q
# 重新登录 [gpadmin@gpnode1 root]$ psql -h 192.168.71.100-U gpadmin_u1 -d gpadmin_db gpadmin_db=>\conninfo You are connected to database "gpadmin_db" asuser "gpadmin_u1" on host "192.168.71.100" at port "5432". \d No relations found.
# 重新登陆后, 临时表已经被销毁
撤销 gpadmin_u1 创建临时表的权限
1 2 3 4 5 6 7 8 9
# 撤销 gpadmin_u1 用户 在 gpadmin_db 创建临时表的权限 gpadmin_db=# REVOKE temporary on database gpadmin_db from gpadmin_u1; NOTICE: no privileges could be revoked # 提示没有可以撤销的权限 REVOKE
gpadmin_db=# REVOKE temp on database gpadmin_db from gpadmin_u1; NOTICE: no privileges could be revoked REVOKE
-- 使用 super 用户创建 schema create schema gpadmin_schema;
\dns List of schemas Name | Owner -------------------+------------ gp_toolkit | gpadmin gpadmin_schema | gpadmin gpadmin_u1_schema | gpadmin_u1 public | gpadmin
-- 使用 super 创建一张表, 供测试使用 create table gpadmin_schema.t1( id int, age varchar, name varchar, PRIMARY KEY(id) );
-- 写入几条测试数据 insert into gpadmin_schema.t1 values(1,18,'xiaoming'); insert into gpadmin_schema.t1 values(2,19,'xiaogang'); insert into gpadmin_schema.t1 values(3,20,'xiaohuang');
-- 为用户赋予 gpadmin_schema 的 usage 权限 (如果没有 usage 权限则用户看不到这张表) grant usage on schema gpadmin_schema to gpadmin_u1;