我正在出席「掘金·启航计划」
权限管理
PG是很骚的,它的权限管理机制是十分灵活且自由的。PG的权限控制甚至可以精确到数组和记录级别。你甚至可以为同一张表中的每位数组单独设置其访问权限。
行级权限控制是PG9.5首次引入的。
权限的类型
PG有几十种权限,其中一些是基本不会用到的。常见的几种权限包括:SELECT,INSERT,UPDATE,ALTER,EXECUTE以及TRUNCATE。
大多数权限须要上下文,也就是须要你去绑定一个特定的数据库对象才有意义。你比如说一个角色拥有ALTER权限,却不告诉它在那个数据库对象上拥有此权限,这是没有意义的。在table1上拥有ALTER权限,在table2上有SELECT权限,在function1上拥有execute权限,就像这样,权限才有意义。当然,你还要明晰的一点是:不是所有的权限都适用于所有的数据库对象,你比如说一张表上的execute权限就是完全说不通的。
当然还有一些权限是无需绑定数据库对象的,比如说CREATEDB和CREATE ROLE。
入门介绍
PG在安装阶段会默认创建一个超级用户角色以及一个database,二者的名称都是postgres。
在创建你自己的收个database之前,需要先创建一个角色作为此database的所有者,所有者可以登录该库。语法如下:
CREATE ROLE mydb_admin LOGIN PASSWORD 'something';
复制代码
创建database并设定其所有者:
CREATE DATABASE mydb WITH owner = mydb_admin;
复制代码
然后我们使用mydb_admin 身份登录并创建schema和表。
GRANT
GRANT命令是授予权限的基本手段。基本的使用方式如下:
GRANT some_privilege TO some_role;
复制代码
下面有几个关于GRANT的使用原则:
取消权限
系统会默认将个别权限授予PUBLIC(所有人)。这些权限包括:CONNECT,CREATE,TEMPTABLE(针对database),EXECUTE(针对函数)。有时候出于安全考虑,你也会取消一些默认权限。
REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA my_schema FROM PUBLIC;
复制代码
revoke connect on database cusdb(新建库名)from public; 回收public角色的权限,不让public角色看到新建的库
复制代码
revoke create on schema public from public; 回收public角色在schemapublic上的创建权限。
复制代码
默认权限
默认权限可以简化权限管理工作,该机制准许用户在数据库对象创建之前就对其设置权限。
新增或则更改默认权限不会影响已有的权限设置,只有当某个对象的某项权限未专门设定的情况下,默认权限设定才能生效。
定义schema的默认权限
GRANT USAGE ON SCHEMA my_schema TO PUBLIC;
复制代码
允许所有还能联接到此databases的用户在my_schema中创建和访问对象,同时该用户须要早已具备访问此schema中所有对象的权限。为用户授予某个schema的USAGE权限是容许该用户访问schema中所有对象的前提条件。如果用户拥有访问schema中某张表的查询权限,却没有该schema的usage权限,则用户也不能访问这张表。
ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema
GRANT SELECT ,REFERENCES ON TABLES TO PUBLIC;
复制代码
为所有具备此schema的USAGE的权限的用户授予该schema中后续创建的所有表的查询和引用(REFERENCES)权限(引用权限指的是针对该表的个别数组构建字段约束的权限)
ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema
GRANT ALL ON TABLES TO mydb_admin WITH GRANT OPTION;
复制代码
把该schema中所有后续创建的表的所有权限都授予mydb_admin角色。同时还容许mydb_admin组的所有成员将本schema中所有后续创建的表的部份或则全部权限授予其他用户。所有权限包括:插入,更新,删除,截断表,创建触发器,创建约束等。PG的与众不同之处
Pg中一个database的所有者并不天然对此库中的所有对象拥有完全的控制权。比如另一个角色可以在你的库里创建一张表,你即便是库的所有者,但是你却无权访问这张表,但是你是有权把整张表都删掉掉的。
在对schema中包含的表和函数等做完授权操作后,切记不要忘记授予schema本省的usage权限。