• 售前

  • 售后

热门帖子
入门百科

Postgresql 数据库权限功能的利用总结

[复制链接]
luly靓 显示全部楼层 发表于 2021-8-14 15:25:15 |阅读模式 打印 上一主题 下一主题
Postgresql数据库支持灵活的权限管理,可以控制一个脚色(组、用户)对某张表的读、写、更新、删除等操纵权限、实验某个函数的权限以及操纵(利用、更新等)视图、序列的权限。
PG的权限管理功能比力强盛,可以细化到对一张表的各个字段,比如克制用户访问一张表里的暗码字段等,在稍后的内容中给出详细的表明。
固然在PG数据库中把用户、脚色同一叫做脚色,甚至创建语句都为create role XXX,但用户和脚色之间仍有肯定的区别。在这里我们同一把拥有登录权限的叫做用户,没有登录权限的叫做脚色,用此方式加以区分。
实际上,在PgAdmin管理工具中,可以看到用户和脚色的区别,没有登录权限的被放在组脚色下,有登录权限的被放在登录脚色下。
根本权限

用户和脚色都可以被赋予根本权限,比如创建数据库权限、超级用户权限、创建脚色权限等。
比如创建用户的语句为:
  1. CREATE ROLE guest LOGIN
  2. NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
复制代码
注意上述Role guest拥有LOGIN的权限,所以叫它用户。
创建脚色的语句为:
  1. CREATE ROLE "group"
  2. NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
复制代码
注意这里没有LOGIN权限,所以是脚色。
上述脚色和用户的创建语句中,都没有赋予超级用户、创建数据库等权限。
操纵数据库对象权限

只能把数据库对象的操纵权限赋予没有登录权限的脚色,而不能直接赋予拥有登录权限的用户。
那么如许就带来一个题目,怎么样控制登任命户操纵数据库对象的权限呢?
答案是让用户成为脚色的成员,此时用户即可拥有脚色的权限,进一步限定了登任命户操纵数据库对象的权限。
如把上述脚色group赋予guest用户:
  1. GRANT "group" TO guest;
复制代码
之后,guest用户就拥有了group脚色所拥有的数据库对象权限。
比如控制group脚色只能对class表实验Insert操纵:
  1. GRANT INSERT ON TABLE class TO "group";
复制代码
此时利用guest用户登录数据后,就只能对表class实验insert操纵,无法实验delete、update等操纵。
示例代码如下,利用guest用户登录,访问TEST数据库下的class表。
  1. Server [localhost]:
  2. Database [postgres]:
  3. Port [5433]:
  4. Username [postgres]: guest
  5. 用户 guest 的口令:
  6. psql (9.4.5)
  7. 输入 "help" 来获取帮助信息.
  8. postgres=> \c TEST
  9. 您现在已经连线到数据库 "TEST",用户 "guest".
  10. TEST=> select * from class;
  11. ERROR: permission denied for relation class
  12. TEST=> insert into class values(2,'class1');
  13. INSERT 0 1
复制代码
从上述结果中可以看到,guest用户没有权限查询class表,但是可以插入数据库。缘故原由就是只对group脚色赋予了class表的insert权限,然后guest用户也就只有class表的insert权限。
前面说到PG的权限管理可以细化到表的某个字段,现在继续用class表和guest用户做实验。
  1. TEST=> \c postgres postgres;
  2. 您现在已经连线到数据库 "postgres",用户 "postgres".
  3. postgres=# \c TEST;
  4. 您现在已经连线到数据库 "TEST",用户 "postgres".
  5. TEST=# grant select(num) on class to "group";
  6. GRANT
  7. TEST=# \echo 切换到postgres用户连接TEST数据库,对class表的num字段的select权限赋予group角色
  8. 切换到postgres用户连接TEST数据库,对class表的num字段的select权限赋予group角色
  9. TEST=# \c TEST guest
  10. 用户 guest 的口令:
  11. 您现在已经连线到数据库 "TEST",用户 "guest".
  12. TEST=> \echo 切换回guest用户登录TEST数据库
  13. 切换回guest用户登录TEST数据库
  14. TEST=> select * from class;
  15. ERROR: permission denied for relation class
  16. TEST=> select num from class;
  17. num
  18. -----
  19.   1
  20.   2
  21. (2 行记录)
复制代码
从上述结果中可以看到,guest用户依然没有查询class表的权限,但是却有了查询class表里的num字段的权限。
在PG数据库中不但单可以控制操纵表的权限,其他数据库对象,比如序列、函数、视图等都可以控制。
所以PG的权限控制功能非常强盛。
增补:Postgres用户对数据库的权限
用户对数据库的权限(登录、超级用户权限)
(1)检察当前数据库中有效户highgo和用户a
  1. highgo=#\du
  2.                List of roles
  3. Role name |          Attributes          | Member of
  4. -----------+------------------------------------------------+-----------
  5. a     |                        | {}
  6. highgo  | Superuser, Create role, Create DB, Replication | {}
复制代码
(2)检察确认当前连接的用户为超级用户highgo,且该用户后创建脚色和数据库的权限等
  1. highgo=#select current_user;
  2. current_user
  3. --------------
  4. highgo
  5. (1row)
复制代码
(3)检察当前集群中的数据库
  1. highgo=#\l
  2.                List of databases
  3.   Name  | Owner | Encoding | Collate |  Ctype  | Access privileges
  4. -----------+--------+----------+------------+------------+-------------------
  5. highgo  | highgo | UTF8   | zh_CN.utf8 |zh_CN.utf8 |
  6. template0 | highgo | UTF8   | zh_CN.utf8 | zh_CN.utf8 | =c/highgo    +
  7.       |    |     |      |      | highgo=CTc/highgo
  8. template1 | highgo | UTF8   | zh_CN.utf8 | zh_CN.utf8 | =c/highgo    +
  9.       |    |     |      |      | highgo=CTc/highgo
  10. (3rows)
复制代码
(4)利用平凡用户a连接数据库正常
  1. highgo=#\c highgo aYouare now connected to database "highgo" as user "a".highgo=>select current_user; current_user-------------- a(1row)(5)利用超级用户highgo连接数据库正常highgo=>\c highgo highgoYouare now connected to database "highgo" as user "highgo".highgo=#select current_user;
  2. current_user
  3. --------------
  4. highgo
  5. (1row)
复制代码
(6)在超级用户连接highgo后,设置不允许平凡用户a连接数据库
  1. highgo=#alter role a nologin;
  2. ALTER ROLE
  3. highgo=#\c highgo a
  4. 致命错误: 不允许角色"a" 进行登录
  5. Previousconnection kept
  6. highgo=#
复制代码
(7)在超级用户连接highgo后,设置不允许平凡用户a连接数据库后,赋予用户a超级用户权限后仍旧无法连接数据库
  1. highgo=#alter role a superuser;
  2. ALTERROLE
  3. highgo=#\du
  4.                List of roles
  5. Role name |          Attributes          | Member of
  6. -----------+------------------------------------------------+-----------
  7. a    | Superuser, Cannot login            | {}
  8. highgo  | Superuser, Create role, Create DB, Replication | {}
  9. highgo=#\c highgo a
  10. 致命错误: 不允许角色"a" 进行登录
  11. Previousconnection kept
复制代码
(8)将登录数据库的权限赋予用户a后,用户a可登录数据库
  1. highgo=#alter role a login;
  2. ALTERROLE
  3. highgo=#\c highgo a
  4. Youare now connected to database "highgo" as user "a".
  5. highgo=#select current_user;
  6. current_user
  7. --------------
  8. a
  9. (1row)
复制代码
以上为个人经验,盼望能给大家一个参考,也盼望大家多多支持草根技能分享。如有错误或未考虑完全的地方,望不吝见教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作