当前位置:   article > 正文

PostgreSQL(七)权限管理_postgresql 权限

postgresql 权限

目录

一、PG的权限说明

二、权限管理层次

三、对象权限概述及权限列表

1、权限类别概述

2、对象权限列表与含义

四、权限管理(语法)

1、授权

2、回收权限

3、易主 

五、小实验

1、实验内容

2、实验过程

3、总结


一、PG的权限说明

1、每个数据库对象都有一个所有者,默认情况下,所有者拥有该对象的所有权限;

对象所有者可以自己回收、重授权自己的权限,用于防止误操作;

2、在数据库中,所有的权限都和角色挂钩;

3、对超级用户 postgres不做权限检查,其它用户走ACL(Access Control list);

4、对于数据库对象,开始只有所有者超级用户可以做任何操作,其它走ACL;

二、权限管理层次

1、实例权限:控制部分用户、主机是否允许登录、访问数据库(白名单&黑名单);

2、schema:PG的一个用户可以有多个schema,但一个schema只能属于一个用户;

3、object:表、视图、索引等对象的增删改查的权限

三、对象权限概述及权限列表

1、权限类别概述

表级对象权限控制;

列级别权限控制;

序列权限控制;

类型域的权限控制(域简单来说就是自定义的带约束的数据类型);

FDW权限控制;

FS权限控制;

函数权限控制;

\ h grant显示所有可设置的访问权限;

2、对象权限列表与含义

  1. rolename = xxxx --privileges granted to a role
  2. = XXXX --privileges granted to PUBLIC
  3. r --SELECT ("read") (允许从指定表,视图或序列的任何列或列出的特定列进行 SELECT。允许用 COPY TO。允许在UPDATE或 DELETE中引用现有列值。
  4. 对于序列,此权限还允许使用currval函数。对于大对象,此权限允许读取对象)
  5. W --UPDATE ("write") (允许将新行INSERT到指定的表中。如果列出了特定列,则只能在INSERT命令中为这些列分配(因此其他列将接收默认值)。也允许 COPY FROM。)
  6. a --INSERT ("append") (允许更新指定表的任何列或列出的特定列,依赖SELECT权限。)
  7. d --DELETE (允许删除指定表中的行,依赖SELECT权限)
  8. D --TRUNCATE (允许在指定的表上截断数据)
  9. X --REFERENCES (允许创建引用指定表或表的指定列的外键约束)
  10. t --TRIGGER (允许在指定的表上创建触发器)
  11. X --EXECUTEU (允许使用指定的函数或过程以及在函数)
  12. U --USAGE (对于schema,允许访问指定模式中包含的对象;对于sequence,允许使用currval和nextval函数。对于类型和域,允许在创建表、函数和其他模式对象时使用类型或域)
  13. C --CREATE (对于数据库,允许在数据库中创建新的schema、tableindex)
  14. c --CONNECT (允许用户连接到指定的数据库。在连接启动时检查此权限)
  15. T --TEMPORARY (TEMP,允许在使用指定数据库时创建临时表)
  16. arwddxt --ALL PRIVILEGES (for tables,varies for other objects
  17. * --grant option for preceding privilege (一次授予所有可用权限)
  18. /yyyy --role that granted this privilege

四、权限管理(语法)

1、授权

详细语法可在PG中执行 \h grant 查看;

简易语法与sql示例如下:

  1. GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,…] | ALL [ PRIVILEGES ] }
  2. ON DATABASE $database_name [,…]
  3. TO $role_specification [,…] [ WITH GRANT OPTION ]
  4. e.g.:
  5. //授权用户wqdb在数据库wqdb上的一切create权限:
  6. GRANT CREATE ON DATABASE wqdb TO wqdb;
  7. //授权访问模式的权限给用户
  8. GRANT USAGE ON SCHEMA $sch_name TO $role_name;
  9. //授权指定模式下对象的访问权限给用户
  10. GRANT SELECT ON $sch_name.$tab_name TO $role_name;

2、回收权限

详细语法可在PG中执行 \h revoke 查看;

简易语法与sql示例如下:

  1. //回收单个权限
  2. REVOKE SELECT ON $tab_name FROM $role_name
  3. //回收多个/所有权限
  4. REVOKE SELECT,UPDATE,INSERT ON $tab_name FROM $role_name;
  5. REVOKE ALL ON $tab_name FROM $role_name;
  6. //回收某模式下所有表的查询权限
  7. REVOKE SELECT ON ALL TABLES IN SCHEMA $schema_name FROM $role_name;
  8. //收列权限
  9. REVOKE SELECT(col1),UPDATE(col1) ON $tab_name FROM $role_name;
  10. //回收所有权限
  11. REVOKE ALL ON $tab_name FROM public;

3、易主 

(1)转移单个表的属主(超级用户、属主可操作,原属主必须是被授权用户的成员)

ALTER TABLE $tab_name OWNER TO $new_owner_name;

(2)转移当前数据库表的属主(超级用户可操作,如果属主是postgres则不允许,因为其中包含数据字典表,只能用单表易主的方式修改)

REASSIGN OWNED BY $old_role_name TO $new_role_name;

五、小实验

1、实验内容

执行SQL--GRANT select ON all tables IN SCHEMA $sch_name TO $role_name;

授权某模式下所有表的查询权限给某个用户。

授权成功后再新建表,此用户能否拥有查看后建的表数据的权限?

答案:不能。

2、实验过程

  1. //1、打开窗口1,超级用户登录,创建实验用户
  2. su - postgres
  3. psql
  4. postgres=# select user;
  5. user
  6. ----------
  7. postgres
  8. (1 行记录)
  9. postgres=# create user u1 password 'u1';
  10. CREATE ROLE
  11. postgres=# grant create on database wqdb to u1;
  12. GRANT
  13. postgres=# create user u2 password 'u2';
  14. CREATE ROLE
  15. postgres=# \du
  16. 角色列表
  17. 角色名称 | 属性 | 成员属于
  18. -------------+--------------------------------------------+------------
  19. dbcreate | 建立 DB, 无法登录 | {}
  20. pgloader_pg | | {}
  21. postgres | 超级用户, 建立角色, 建立 DB, 复制, 绕过RLS | {}
  22. u1 | | {}
  23. u2 | | {}
  24. //2、打开窗口2,u1用户登录,创建实验模式u1test与实验表a
  25. psql -U u1 -d wqdb
  26. wqdb=> create schema u1test;
  27. CREATE SCHEMA
  28. wqdb=> create table u1test.a(id int);
  29. CREATE TABLE
  30. wqdb=> insert into u1test.a values (1);
  31. INSERT 0 1
  32. wqdb=> select * from u1test.a;
  33. id
  34. ----
  35. 1
  36. (1 行记录)
  37. //3、打开窗口3,u2用户登录,查询实验表
  38. psql -U u2 -d wqdb
  39. wqdb=> set search_path="$user", public,u1test;
  40. SET
  41. wqdb=> \d
  42. 关联列表
  43. 架构模式 | 名称 | 类型 | 拥有者
  44. ----------+------+--------+--------
  45. u1test | a | 数据表 | u1
  46. (1 行记录)
  47. wqdb=> select * from u1test.a;
  48. id
  49. ----
  50. 1
  51. (1 行记录)
  52. //4、回到窗口2,新建表b
  53. wqdb=> create table u1test.b(id int);
  54. CREATE TABLE
  55. wqdb=> insert into u1test.b values (2);
  56. INSERT 0 1
  57. wqdb=> select * from u1test.b;
  58. id
  59. ----
  60. 2
  61. (1 行记录)
  62. //5、回到窗口3,查看表b
  63. wqdb=> \d
  64. 关联列表
  65. 架构模式 | 名称 | 类型 | 拥有者
  66. ----------+------+--------+--------
  67. u1test | a | 数据表 | u1
  68. u1test | b | 数据表 | u1
  69. (2 行记录)
  70. wqdb=> select * from u1test.b;
  71. 错误: 对表 b 权限不够

3、总结

从最后的查询结果来看,授权后再新建的表,使用\d可以看到表存在,但无法查看表数据。

(pg可以实现:授权查看schema下所有表的权限后,也能查看后建的表数据。

具体实现方法等待更新中)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/573729
推荐阅读
相关标签
  

闽ICP备14008679号