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在权限管理的层次结构:
实例级别的权限
由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 波罗