管理用户权限

最近更新时间:2019-03-15 17:55:05

角色概述

在 Snova 中使用 roles 来对数据库的访问权限进行管理,角色(roles)的概念实际上包含了 users 与 groups 两部分,一个 role 可以是数据库普通用户,即 user,也可以是数据库的用户组,即 group。角色可以拥有数据库对象(例如表、视图等),并且可以将这些对象的访问权限分配给其他角色。

集群创建时,会提示用户设置初始用户名和密码,这个初始用户为“管理员用户”,该用户拥有创建用户、创建数据库、登录的权限。集群创建完成后,可以使用“管理员用户”连接数据库,一般地,管理员用户拥有最大化的权限,也意味着这个账号要被尽量少的人使用,因此您可以使用管理员用户创建其他用户,并为这些用户授予所需要的权限,具体授权参考 用户组对象权限管理。您也可以创建数据库以及其他对象,参考 定义数据库。登录数据库可以参考 连接数据库

创建用户

role 分为用户 user 和用户组 group,通常 user 级别的 role(后面统称 user)具有能够登录Snova 数据库并初始化一个会话的权限,因此,在建立一个 user 时,必须为其赋予 LOGIN 的权限。例如:

CREATE role jsmith with LOGIN;

通过上述操作,创建了一个具有 LOGIN 权限的 user,通过这个 user,可以对数据库进行连接。Snova 对用户的访问管理除了 LOGIN 权限外,还有以下其他权限,可以在使用 CREATE ROLE 语句创建角色时对其所能拥有的权限进行授权。

权限取值 作用 默认值
SUPERUSER Ι NOSUPERUSER 超级用户权限,只有超级用户才能创建其他的超级用户 NOSUPERUSER
CREATEDB Ι NOCREATEDB 创建数据库的权限 NOCREATEDB
CREATEROLE Ι NOCREATEROLE 创建和管理角色 NOCREATEROLE
INHERIT Ι NOINHERIT 决定了用户继承所属group的权限 INHERIT
LOGIN Ι NOLOGIN 连接登录数据库的权限,一般用户拥有该权限,用户组无该权限 NOLOGIN
CONNECTION LIMIT 限制能够并发连接数据库的连接数,-1 表示无限制 -1
CREATEEXTTABLE Ι NOCREATEEXTTABLE 创建外表的权限 NOCREATEEXTTABLE
PASSWORD 创建用户时设置密码
VALID UNTIL 'timestamp' 密码的到期时间
RESOURCE QUEUE 'name' 用户连接后,建立的查询被安排到的资源队列名 pg_default

除了在在创建用户时能够对其进行权限授予,还能在创建完成后通过ALTER ROLE语法对其进行权限的重新赋予。例如:

ALTER role jsmith with CREATEROLE;

用户组

group,即用户组,是一种特殊的 role,没有赋予 LOGIN 权限,group 通常被设定为经常搭配使用的权限组合,权限可以被作为一个整体授予给某个用户或者从某个用户处取消。

您可以通过使用以下语句来创建一个被授予权限组合的角色,即 group。

Create role, Create DB, Cannot login;

您还可以很方便地通过 GRANT TO 或者 REVOKE FROM 语句建立或者取消其他用户与该用户组的从属关系,拥有从属关系的用户会从这个用户组继承权限。

  • GRANT TO 语句示例:用户 jsmith 归属于用户组 manager。
  • REVOKE FROM 语句示例:将用户 jsmith 归属于用户组 manager 的关系取消。

对象权限管理

当一个对象(例如 database、table、schema、function 等)被创建时,必然会有一个归属者,这个归属者一般为执行创建对象语句的用户。初始时,只有归属者对这个对象拥有所有的操作权限。例如:

GRANT INSERT ON test TO  jsmith;

我们可以通过上述语句,将 test 的 INSERT 权限授予 jsmith 用户,同样也可以通过 REVOKE FROM 取消。

同样,也可以通过 REASSIGN OWNED 语句将归属于某个用户的所有对象转移给别的用户,例如:

SET ROLE jsmith;   //切换到jsmith用户
CREATE TABLE jsmithtest (age int, id int); //创建新的表
SET ROLE gpadmincloud;        //切回到超级用户
reassign owned by jsmith to lambuser;   //将归属于jsmith的对象都转移给lambuser。

由于归属于超级用户的对象不能转移给别的用户,因为有属于系统的对象归属于这个超级对象,因此我们需要使用非超级用户建立一个表。

完成对象从 jsmith 到 lambuser 归属权的转移。