PostgreSQL中的角色浅析

原本角色相关的单词都是能够小写的,为了表示重要性,本文中所有大写。html

 

ROLE的概念sql

PostgreSQL经过Role的概念管理数据库的访问权限。数据库

ROLE能够拥有数据库对象,如表、函数,也能够GRANT相关权限给其余ROLE。安全

Role能够被当作User使用,也能够当作Group使用,或者既是User也是Group,彻底看这个Role如何设置。session

PG 8.1版本以前还有User和Group的概念,以后都纳入Role。函数

 

ROLE的分类:post

一、按数量,分类普通ROLE和GROUP测试

二、按权限大小,分为:ROLE、USER、ADMIN、SUPERUSERui

 

GROUPspa

在GP系统的用户管理中,一般会把多个ROLE赋予一个GROUP,这样能够对该GROUP中的ROLE作批量的权限操做。

在设置权限时只需给该组设置便可,撤销权限时也是从该组撤消。在PostgreSQL中,首先须要建立一个表明组的角色,以后再将该角色的membership权限赋给独立的用户角色便可。

GROUP关系demo:

rathandb=# CREATE ROLE rathan_group_test;
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
rathandb=# CREATE ROLE rathan_group_member IN ROLE rathan_group_test INHERIT;
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
rathandb=# CREATE ROLE rathan_group_member2 IN ROLE rathan_group_test;
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
rathandb=# CREATE ROLE rathan_no_group_member;
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
rathandb=# \du+ rathan_*;
                               List of roles
       Role name        |  Attributes  |      Member of      | Description
------------------------+--------------+---------------------+-------------
 rathan_group_member    | Cannot login | {rathan_group_test} |
 rathan_group_member2   | Cannot login | {rathan_group_test} |
 rathan_group_test      | Cannot login |                     |
 rathan_no_group_member | Cannot login |                     |
 
rathandb=# ALTER ROLE rathan_no_group_member IN ROLE rathan_group_test;
ERROR:  option "addroleto" not recognized (user.c:813)
rathandb=# GRANT rathan_group_test TO rathan_no_group_member;
GRANT ROLE
                                    List of roles
       Role name        |       Attributes        |      Member of      | Description
------------------------+-------------------------+---------------------+-------------
 rathan_group_member    | Cannot login            | {rathan_group_test} |
 rathan_group_member2   | Cannot login            | {rathan_group_test} |
 rathan_group_test      |                         |                     |
 rathan_no_group_member | Cannot login            | {rathan_group_test} |
 
rathandb=# REVOKE rathan_group_test FROM rathan_no_group_member;
rathandb=# \du+ rathan_*;
                                    List of roles
       Role name        |       Attributes        |      Member of      | Description
------------------------+-------------------------+---------------------+-------------
 rathan_group_member    | Cannot login            | {rathan_group_test} |
 rathan_group_member2   | Cannot login            | {rathan_group_test} |
 rathan_group_test      |                         |                     |
 rathan_no_group_member | Cannot login            |                     |
 
 rathandb=# DROP ROLE rathan_group_test;
 rathandb=# \du+ rathan_*;
                                    List of roles
       Role name        |       Attributes        |      Member of      | Description
------------------------+-------------------------+---------------------+-------------
 rathan_group_member    | Cannot login            |                     |
 rathan_group_member2   | Cannot login            |                     |
 rathan_no_group_member | Cannot login            |                     |

LOGIN赋权操做:

rathandb=# ALTER ROLE rathan_group_test WITH LOGIN;
ALTER ROLE
rathandb=# \du+ rathan_*;
                               List of roles
       Role name        |  Attributes  |      Member of      | Description
------------------------+--------------+---------------------+-------------
 rathan_group_member    | Cannot login | {rathan_group_test} |
 rathan_group_test      |              |                     |
 rathan_no_group_member | Cannot login |                     |

rathan_group_member继承了rathan_group_test的权限,为何仍是没有login属性?

由于角色属性LOGIN、SUPERUSER和CREATEROLE被视为特殊权限,它们不会像其它数据库对象的普通权限那样被继承。

 

ROLE与USER:

USER表示带有LOGIN属性的ROLE。

CREATE ROLE建立的用户默认不带LOGIN属性,而CREATE USER建立的用户默认带有LOGIN属性。

LOGIN权限demo:

rathandb=# CREATE ROLE rathan_role_test;
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
rathandb=# CREATE USER rathan_user_test;
NOTICE:  resource queue required -- using default resource queue "pg_default"
CREATE ROLE
rathandb=# \du+ rathan_*;
                            List of roles
     Role name     |  Attributes  |      Member of      | Description
-------------------+--------------+---------------------+-------------
 rathan_group_test |              |                     |
 rathan_role_test  | Cannot login |                     |
 rathan_user_test  |              |                     |

 

SUPERUSER

一、只有SUPERUSER能够建立SUPERUSER,SUPERUSER能够改写全部的database限制。

二、数据库的超级用户拥有该数据库的全部权限,为了安全起见,咱们最好使用非超级用户完成咱们的正常工做。和建立普通用户不一样,建立超级用户必须是以超级用户的身份执行如下命令:

rathandb=# CREATE ROLE rathan_normal_role;
rathandb=# CREATE ROLE rathan_superuser WITH SUPERUSER;
CREATE ROLE
rathandb=# CREATE ROLE rathan_superuser2 WITH SUPERUSER LOGIN;
CREATE ROLE
rathandb=# \du+ rathan_*;
                                    List of roles
       Role name        |       Attributes        |      Member of      | Description
------------------------+-------------------------+---------------------+-------------
 rathan_normal_role     | Cannot login            |                     |
 rathan_superuser       | Superuser, Cannot login |                     |
 rathan_superuser2      | Superuser               |                     |

 

ADMIN 

能够GRANT GROUP TO 其余ROLE,或者REVOKE GROUP FROM 其余ROLE。

ADMIN权限demo:

rathandb=# SET SESSION AUTHORIZATION 'gpadmin';
rathandb=# CREATE ROLE rathan_role_admin IN ROLE rathan_group_test;
rathandb=# CREATE ROLE rathan_role_no_admin IN ROLE rathan_group_test;
rathandb=# CREATE ROLE rathan_role_test IN ROLE rathan_group_test;
rathandb=# GRANT rathan_group_test TO rathan_role_admin WITH ADMIN OPTION;
rathandb=# \du+ rathan_*;
                              List of roles
      Role name       |  Attributes  |      Member of      | Description
----------------------+--------------+---------------------+-------------
 rathan_group_test    |              |                     |
 rathan_role_admin    | Cannot login | {rathan_group_test} |
 rathan_role_no_admin | Cannot login | {rathan_group_test} |
 rathan_role_test     | Cannot login | {rathan_group_test} |

rathandb=# SET SESSION AUTHORIZATION 'rathan_role_admin';
rathandb=# SELECT SESSION_USER, CURRENT_USER;
   session_user    |   current_user
-------------------+-------------------
 rathan_role_admin | rathan_role_admin
(1 row)

rathandb=# REVOKE rathan_group_test FROM rathan_role_test;
REVOKE ROLE
rathandb=# \du+ rathan_role_test;
                       List of roles
     Role name     |  Attributes  | Member of | Description
-------------------+--------------+-----------+-------------
 rathan_role_test | Cannot login |           |

rathandb=# GRANT rathan_group_test TO rathan_role_test;
GRANT ROLE
rathandb=# SET SESSION AUTHORIZATION 'rathan_role_no_admin';
SET
rathandb=# SELECT SESSION_USER, CURRENT_USER;
     session_user     |     current_user
----------------------+----------------------
 rathan_role_no_admin | rathan_role_no_admin
(1 row)

rathandb=# REVOKE rathan_group_test FROM rathan_role_test;
ERROR:  must have admin option on role "rathan_group_test"

 

补充:

设置默认schema:

ALTER USER username SET search_path = schema1,schema2,schema3,etc;

 

关于一点点权限

默认状况下,只有建立database的ROLE才有权限对database作全量操做;
Superuser能够访问全部的object。其余帐号想要使用须要被GRANT权限;

权限分类: SELECT, INSERT, UPDATE, DELETE, REFERENCES, TRIGGER, CREATE, CONNECT, TEMPORARY, EXECUTE, and USAGE. 

上述权限所有GRANT的话能够用ALL代替。

 

本文中的测试环境:

psql --version
psql (PostgreSQL) 8.2.15

 

相关官方文档:

角色:

http://www.postgresql.org/docs/8.2/static/user-manag.html

命令:

CREATE ROLEALTER ROLEDROP ROLEGRANTREVOKESET ROLESET SESSION AUTHORIZATION

权限:

http://www.postgresql.org/docs/8.2/static/ddl-priv.html

相关文章
相关标签/搜索