数据库角色
PostgreSQL使用角色的概念管理数据库访问权限。一个角色可以被看成是一个数据库用户或者是一个数据库用户组,这取决于角色被怎样设置。
角色可以拥有数据库对象(例如,表和函数)并且能够把那些对象上的权限赋予给其他角色来控制谁能访问哪些对象。
此外,还可以把一个角色中的成员资格授予给另一个角色,这样允许成员角色使用被赋予给另一个角色的权限。
1. 数据库角色
数据库角色在概念上已经完全与操作系统用户独立开来。
要创建一个角色,可使用CREATE ROLE SQL 命令:
CREATE ROLE name;//DROP ROLE name;
createuser name;//dropuser name
要决定现有角色的集合,检查pg_roles系统目录,例如:
SELECT rolname FROM pg_roles;
[root@mysqlhq soft]# su - postgres
Last login: Mon Nov 19 10:43:07 CST 2018 on pts/1
-bash-4.2$ psql
psql (9.5.2)
Type "help" for help.
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
exampledb | dbuser | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/dbuser +
| | | | | dbuser=CTc/dbuser
postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
(4 rows)
postgres=# SELECT rolname FROM pg_roles;
rolname
----------
postgres
dbuser
(2 rows)
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
dbuser | | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
2. 角色属性
一个数据库角色可以有一些属性,它们定义角色的权限并且与客户端认证系统交互。
login privilege
只有具有LOGIN属性的角色才能被用于一个数据库连接的初始角色名称。
CREATE ROLE name LOGIN;
CREATE USER name;
(CREATE USER和CREATE ROLE等效,除了CREATE USER默认假定有LOGIN,而CREATE ROLE不这样认为)。
superuser status
一个数据库超级用户会绕开所有权限检查,除了登入的权利。最好用一个不是超级用户的角色来完成你的大部分工作。要创建一个新
数据库超级用户,使用CREATE ROLE name SUPERUSER。
database creation
一个角色必须被显式给予权限才能创建数据库,要创建这样一个角色,使用CREATE ROLE name CREATEDB。
role creation
一个角色必须被显式给予权限才能创建更多角色,要创建这样一个角色,使用CREATE ROLE name CREATEROLE。
一个带有CREATEROLE权限的角色也可以修改和删除其他角色,还可以授予或回收角色中的成员关系。
initiating replication
一个角色必须被显式给予权限才能发起流复制一个被用于流复制的角色必须还有LOGIN权限。要创建这样一个角色,使用CREATE ROLE name REPLICATION LOGIN。
password
只有当客户端认证方法要求用户在连接数据库时提供一个口令时,一个口令才有意义。password和md5认证方法使用口令。数据库口令与操作系统命令独立。在角色创建
时指定一个口令:CREATE ROLE name PASSWORD ’string’。在创建后可以用ALTER ROLE修改一个角色属性。
提示: 一个好习惯是创建一个具有CREATEDB和CREATEROLE权限的角色,而不是创建一个超级用户,并且然后用这个角色来完成对数据库和角色的例行管理。
这种方法避免了在非必要时作为超级用户操作任务的风险。
一个角色也可以有角色相关的默认值
例如,如果出于某些原因你希望在每次连接时禁用索引扫描(提示:不是好主意)
ALTER ROLE myname SET enable_indexscan TO off;
这将保存设置(但是不会立刻设置它)
要移除一个角色相关的默认设置,使用ALTER ROLE rolename RESETvarname。
3. 角色成员关系
CREATE ROLE name;
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;
不允许把一个角色中的成员关系授予给PUBLIC。
有INHERIT属性的成员角色自动地具有它们所属角色的权限,包括任何组角色继承得到的权限。
CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
在作为角色joe连接后,一个数据库会话将立即拥有直接授予给joe的权限,外加任何授予给admin的权限,因为joe“继承了” admin的权限。
然而,授予给wheel的权限不可用,因为即使joe是wheel的一个间接成员,但是该成员关系是通过带NOINHERIT属性的admin得到的。在:
SET ROLE admin;
之后,该会话将只拥有授予给admin的权限,但是没有授予给joe的权限。在执行:
SET ROLE wheel;
之后,该会话将只拥有授予给wheel的权限,但是没有授予给joe或admin的权限。初始的权限状态可以使用下面命令之一恢复:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
注意: SET ROLE命令总是允许选择原始登录角色的直接或间接组角色。因此,在上面的例子中,在成为wheel之前不必先成为admin。
角色属性LOGIN、SUPERUSER、CREATEDB和CREATEROLE可以被认为是一种特殊权限,但是它们从来不会像数据库对象上的普通权限那样被继承。
要使用这些属性,你必须实际SET ROLE到一个有这些属性之一的特定角色。
4. 删除角色
由于角色可以拥有数据库对象并且能持有访问其他对象的特权, 删除一个角色常常并非一次DROP ROLE就能解决。
任何被该角色所拥有的对象必须首先被删除或者转移给其他拥有者, 并且任何已被授予给该角色的权限必须被收回。
对象的拥有关系可以使用ALTER命令一次转移出去,例如:
ALTER TABLE bobs_table OWNER TO alice;
总之,移除曾经拥有过对象的角色的方法是
REASSIGN OWNED BY doomed_role TO successor_role;//REASSIGN OWNED 命令可以被用来把要被删除的角色所拥有的所有对象的拥有关系转移给另一个角色。
DROP OWNED BY doomed_role;
DROP ROLE doomed_role;
5. 函数和触发器安全性
函数和触发器允许用户在后端服务器中插入代码,其他用户不会注意到这些代码的执行。