Postgresql数据库支持灵活的权限管理,可以控制一个角色(组、用户)对某张表的读、写、更新、删除等操作权限、执行某个函数的权限以及操作(使用、更新等)视图、序列的权限。
PG的权限管理功能比较强大,可以细化到对一张表的各个字段,比如禁止用户访问一张表里的密码字段等,在稍后的内容中给出详细的解释。
虽然在PG数据库中把用户、角色统一叫做角色,甚至创建语句都为create role XXX,但用户和角色之间仍有一定的区别。在这里我们统一把拥有登录权限的叫做用户,没有登录权限的叫做角色,用此方式加以区分。
实际上,在PgAdmin管理工具中,可以看到用户和角色的区别,没有登录权限的被放在组角色下,有登录权限的被放在登录角色下。
基本权限
用户和角色都可以被赋予基本权限,比如创建数据库权限、超级用户权限、创建角色权限等。
比如创建用户的语句为:
CREATE ROLE guest LOGIN NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
注意上述Role guest拥有LOGIN的权限,所以叫它用户。
创建角色的语句为:
CREATE ROLE "group" NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
注意这里没有LOGIN权限,所以是角色。
上述角色和用户的创建语句中,都没有赋予超级用户、创建数据库等权限。
操作数据库对象权限
只能把数据库对象的操作权限赋予没有登录权限的角色,而不能直接赋予拥有登录权限的用户。
那么这样就带来一个问题,怎么样控制登录用户操作数据库对象的权限呢?
答案是让用户成为角色的成员,此时用户即可拥有角色的权限,进一步限制了登录用户操作数据库对象的权限。
如把上述角色group赋予guest用户:
GRANT "group" TO guest;
之后,guest用户就拥有了group角色所拥有的数据库对象权限。
比如控制group角色只能对class表执行Insert操作:
GRANT INSERT ON TABLE class TO "group";
此时使用guest用户登录数据后,就只能对表class执行insert操作,无法执行delete、update等操作。
示例代码如下,使用guest用户登录,访问TEST数据库下的class表。
Server [localhost]: Database [postgres]: Port [5433]: Username [postgres]: guest 用户 guest 的口令: psql (9.4.5) 输入 "help" 来获取帮助信息. postgres=> \c TEST 您现在已经连线到数据库 "TEST",用户 "guest". TEST=> select * from class; ERROR: permission denied for relation class TEST=> insert into class values(2,'class1'); INSERT 0 1
从上述结果中可以看到,guest用户没有权限查询class表,但是可以插入数据库。原因就是只对group角色赋予了class表的insert权限,然后guest用户也就只有class表的insert权限。
前面说到PG的权限管理可以细化到表的某个字段,现在继续用class表和guest用户做实验。
TEST=> \c postgres postgres; 您现在已经连线到数据库 "postgres",用户 "postgres". postgres=# \c TEST; 您现在已经连线到数据库 "TEST",用户 "postgres". TEST=# grant select(num) on class to "group"; GRANT TEST=# \echo 切换到postgres用户连接TEST数据库,对class表的num字段的select权限赋予group角色 切换到postgres用户连接TEST数据库,对class表的num字段的select权限赋予group角色 TEST=# \c TEST guest 用户 guest 的口令: 您现在已经连线到数据库 "TEST",用户 "guest". TEST=> \echo 切换回guest用户登录TEST数据库 切换回guest用户登录TEST数据库 TEST=> select * from class; ERROR: permission denied for relation class TEST=> select num from class; num ----- 1 2 (2 行记录)
从上述结果中可以看到,guest用户依然没有查询class表的权限,但是却有了查询class表里的num字段的权限。
在PG数据库中不单单可以控制操作表的权限,其他数据库对象,比如序列、函数、视图等都可以控制。
所以PG的权限控制功能非常强大。
补充:Postgres用户对数据库的权限
用户对数据库的权限(登录、超级用户权限)
(1)查看当前数据库中有用户highgo和用户a
highgo=#\du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- a | | {} highgo | Superuser, Create role, Create DB, Replication | {}
(2)查看确认当前连接的用户为超级用户highgo,且该用户后创建角色和数据库的权限等
highgo=#select current_user; current_user -------------- highgo (1row)
(3)查看当前集群中的数据库
highgo=#\l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+--------+----------+------------+------------+------------------- highgo | highgo | UTF8 | zh_CN.utf8 |zh_CN.utf8 | template0 | highgo | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/highgo + | | | | | highgo=CTc/highgo template1 | highgo | UTF8 | zh_CN.utf8 | zh_CN.utf8 | =c/highgo + | | | | | highgo=CTc/highgo (3rows)
(4)使用普通用户a连接数据库正常
highgo=#\c highgo a Youare now connected to database "highgo" as user "a". highgo=>select current_user; current_user -------------- a (1row) (5)使用超级用户highgo连接数据库正常 highgo=>\c highgo highgo Youare now connected to database "highgo" as user "highgo". highgo=#select current_user; current_user -------------- highgo (1row)
(6)在超级用户连接highgo后,设置不允许普通用户a连接数据库
highgo=#alter role a nologin; ALTER ROLE highgo=#\c highgo a 致命错误: 不允许角色"a" 进行登录 Previousconnection kept highgo=#
(7)在超级用户连接highgo后,设置不允许普通用户a连接数据库后,赋予用户a超级用户权限后仍然无法连接数据库
highgo=#alter role a superuser; ALTERROLE highgo=#\du List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- a | Superuser, Cannot login | {} highgo | Superuser, Create role, Create DB, Replication | {} highgo=#\c highgo a 致命错误: 不允许角色"a" 进行登录 Previousconnection kept
(8)将登录数据库的权限赋予用户a后,用户a可登录数据库
highgo=#alter role a login; ALTERROLE highgo=#\c highgo a Youare now connected to database "highgo" as user "a". highgo=#select current_user; current_user -------------- a (1row)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]