HGDB 之 权限管理

本文内容主要是在HGDB V4.1.1环境验证,同样适用于Postgresql 9.5环境。

1. 创建用户时设定属性或修改用户的属性,属性内容包含一定的数据库权限

基本语法格式

CREATE ROLE role_name WITH optional_permissions;

ALTER ROLE username WITH attribute_options;

 

常用属性

说明

login

只有具有 LOGIN 属性的角色可以用做数据库连接的初始角色名。

superuser

数据库超级用户

createdb

创建数据库权限

createrole

允许其创建或删除其他普通的用户角色(超级用户除外)

replication

做流复制的时候用到的一个用户属性,一般单独设定。

password

在登录时要求指定密码时才会起作用,比如md5或者password模式,跟客户端的连接认证方式有关

inherit

用户组对组员的一个继承标志,成员可以继承用户组的权限特性

 

示例:在创建用户时设定登录权限。

CREATE ROLE username WITH LOGIN;

 

可以通过\h CREATE ROLE[USER]指令查看全部可设置的管理权限

 

\du 指令显示用户和用户的用户属性

 

db_t=# \du

                                   List of roles

 Role name |                         Attributes                         | Member of

-----------+------------------------------------------------------------+-----------

 highgo    | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

 role1     | Cannot login                                               | {}

 role_t    | Superuser, Cannot login                                    | {}

 user_t    | Superuser                                                  | {}

 user_t1   |                                                            | {}

 

权限管控

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

在数据库中所有的权限都和角色挂钩,HGDB权限分为两部分:

“系统权限”或者数据库用户的属性;

数据库对象上的操作权限。

 

对超级用户Highgo不做权限检查,其它用户走ACL(Access ControL List)。

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

 

HGDB在权限管理的层次结构:

 HGDB 之 权限管理

实例级别的权限

由pg_hba.conf来控制,例如 :

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:

host    all             all             127.0.0.1/32            trust

host all postgres 0.0.0.0/0 reject

host    all             all             0.0.0.0/0                  md5

 

以上配置的解释

允许任何本地用户无密码连接任何数据库

不允许postgres用户从任何外部地址连接任何数据库

允许其他任何用户从外部地址通过密码连接任何数据库


数据库级别的权限

包括允许连接数据库,允许在数据库中创建schema。

默认情况下,数据库在创建后

允许public角色连接,即允许任何人连接。

不允许除了超级用户和owner之外的任何人在数据库中创建schema。

会自动创建名为public 的schema,这个schema的all权限已经赋予给public角色,即允许任何人在里面创建对象。

基本语法参考

GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }

    ON DATABASE database_name [, ...]

    TO role_specification [, ...] [ WITH GRANT OPTION ]

 

schema级别的权限

包括允许查看schema中的对象,允许在schema中创建对象。

默认情况下新建的schema的权限不会赋予给public角色,因此除了超级用户和owner,任何人都没有权限查看schema中的对象或者在schema中新建对象。

基本语法参考:

GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }

    ON SCHEMA schema_name [, ...]

TO role_specification [, ...] [ WITH GRANT OPTION ]

 

对象级别的权限

每种类型的对象权限属性都不一样,具体可参考

http://www.postgresql.org/docs/9.5/static/sql-grant.html

基本语法参考(表对象):

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }

    [, ...] | ALL [ PRIVILEGES ] }

    ON { [ TABLE ] table_name [, ...]

         | ALL TABLES IN SCHEMA schema_name [, ...] }

    TO role_specification [, ...] [ WITH GRANT OPTION ]

 

设置访问权限

示例:

GRANT ALL ON database dbname TO rolename;  

GRANT UPDATE ON tabname TO demo_role;

GRANT SELECT ON ALL TABLES IN SCHEMA schemaname to rolename;

GRANT ALL ON tabname TO rolename;  

GRANT SELECT ON tabname TO PUBLIC;  

特殊符号:ALL代表所访问权限,PUBLIC代表所有用户


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

查看访问权限

\du 或\du+ [username]显示角色属性(包含权限),也可以查看系统表select * from pg_roles;  

查看某用户或角色的权限(***)

select * from information_schema.table_privileges where grantee='user_name';

显示对象的访问权限

\z或\dp [tablename]

 

权限的含义如下:

rolename=xxxx -- privileges granted to a role

        =xxxx -- privileges granted to PUBLIC

            r -- SELECT ("read")

            w -- UPDATE ("write")

            a -- INSERT ("append")

            d -- DELETE

            D -- TRUNCATE

            x -- REFERENCES

            t -- TRIGGER

            X -- EXECUTE

            U -- USAGE

            C -- CREATE

            c -- CONNECT

            T -- TEMPORARY

      arwdDxt -- ALL PRIVILEGES (for tables, varies for other objects)

            * -- grant option for preceding privilege

        /yyyy -- role that granted this privilege

 

撤销用户权限

语法格式如下:

REVOKE permission_type ON table_name FROM user_name;

其中permission_type和table_name含义与GRANT指令中相同。


by 波罗