PostgreSQL学习手册(十) 角色和权限

Stella981
• 阅读 365

  PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户。角色可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限。
    
一、数据库角色:

     1. 创建角色:
     CREATE ROLE role_name;
    
     2. 删除角色:
     DROP ROLE role_name;
    
     3. 查询角色:
    检查系统表pg_roles,如:
     SELECT rolname FROM pg_roles;
    也可以在psql中执行\du命令列出所有角色。
    
二、角色属性:

    一个数据库角色可以有一系列属性,这些属性定义他的权限,以及与客户认证系统的交互。
     1. 登录权限:
    只有具有LOGIN属性的角色才可以用于数据库连接,因此我们可以将具有该属性的角色视为登录用户,创建方法有如下两种:
CREATE ROLE name LOGIN PASSWORD '123456‘;
CREATE USER name PASSWORD '123456';
    
     2. 超级用户:
    数据库的超级用户拥有该数据库的所有权限,为了安全起见,我们最好使用非超级用户完成我们的正常工作。和创建普通用户不同,创建超级用户必须是以超级用户的身份执行以下命令:
     CREATE ROLE name  SUPERUSER ;
    
     3. 创建数据库:
    角色要想创建数据库,必须明确赋予创建数据库的属性,见如下命令:
     CREATE ROLE name CREATEDB;
    
     4. 创建角色:
    一个角色要想创建更多角色,必须明确给予创建角色的属性,见如下命令:
     CREATE ROLE name  CREATEROLE ;
    
三、权限:

    数据库对象在被创建时都会被赋予一个所有者,通常而言,所有者就是执行对象创建语句的角色。对于大多数类型的对象,其初始状态是只有所有者(或超级用户)可以对该对象做任何事情。如果要允许其它用户可以使用该对象,必须赋予适当的权限。PostgreSQL中预定义了许多不同类型的内置权限,如: SELECT、INSERT、UPDATE、DELETE、RULE、REFERENCES、TRIGGER、CREATE、TEMPORARY、EXECUTE和USAGE
    我们可以使用GRANT命令来赋予权限,如:
     GRANT UPDATE ON accounts TO joe;
    对于上面的命令,其含义为将accounts表的update权限赋予joe角色。此外,我们也可以用特殊的名字PUBLIC把对象的权限赋予系统中的所有角色。在权限声明的位置上写ALL,表示把适用于该对象的所有权限都赋予目标角色。
    要撤销权限,使用合适的REVOKE命令:
     REVOKE ALL ON accounts FROM PUBLIC;
    其含义为:对所有角色(PUBLIC)撤销在accounts对象上的所有权限(ALL)。

四、角色成员:

    在系统的用户管理中,通常会把多个用户赋予一个组,这样在设置权限时只需给该组设置即可,撤销权限时也是从该组撤消。在PostgreSQL中,首先需要创建一个代表组的角色,之后再将该角色的membership权限赋给独立的用户角色即可。
    1. 创建一个组角色,通常而言,该角色不应该具有LOGIN属性,如:
     CREATE ROLE name;    
    2. 使用GRANT和REVOKE命令添加和撤消权限:
GRANT group_role TO role1, ... ;
REVOKE group_role FROM role1, ... ;

   一个角色成员可以通过两种方法使用组角色的权限,如:
    1. 每个组成员都可以用SET ROLE命令将自己临时"变成"该组成员,此后再创建的任何对象的所有者将属于该组,而不是原有的登录用户。
    2. 拥有INHERIT属性的角色成员自动继承它们所属角色的权限。
    见如下示例:
CREATE ROLE joe LOGIN INHERIT;  --INHERIT是缺省属性。
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
    现在我们以角色joe的身份与数据库建立连接,那么该数据库会话将同时拥有角色joe和角色admin的权限,这是因为joe"继承 (INHERIT)"了admin的权限。然而与此不同的是,赋予wheel角色的权限在该会话中将不可用,因为joe角色只是wheel角色的一个间接成员,它是通过admin角色间接传递过来的,而admin角色却含有NOINHERIT属性,这样wheel角色的权限将无法被joe继承。
  这样wheel角色的权限将无法被joe继承。此时,我们可以在该会话中执行下面的命令:
    SET ROLE admin;
    在执行之后,该会话将只拥有admin角色的权限,而不再包括赋予joe角色的权限。同样,在执行下面的命令之后,该会话只能使用赋予wheel的权限。
    SET ROLE wheel;
    在执行一段时间之后,如果仍然希望将该会话恢复为原有权限,可以使用下列恢复方式之一:
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
    注意: SET ROLE命令总是允许选取当前登录角色的直接或间接组角色。因此,在变为wheel之前没必要先变成admin。 
    角色属性LOGIN、SUPERUSERCREATEROLE被视为特殊权限,它们不会像其它数据库对象的普通权限那样被继承。如果需要,必须在调用SET ROLE时显式指定拥有该属性的角色。比如,我们也可以给admin角色赋予CREATEDB和CREATEROLE权限,然后再以joe的角色连接数据库,此时该会话不会立即拥有这些特殊权限,只有当执行SET ROLE admin命令之后当前会话才具有这些权限。 
    要删除一个组角色,执行DROP ROLE group_role命令即可。然而在删除该组角色之后,它与其成员角色之间的关系将被立即撤销(成员角色本身不会受影响)。不过需要注意的是,在删除之前,任何属于该组角色的对象都必须先被删除或者将对象的所有者赋予其它角色,与此同时,任何赋予该组角色的权限也都必须被撤消。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
RBAC模型
RBAC基于角色的访问控制(RoleBasedAccessControl)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用
Wesley13 Wesley13
2年前
java用户角色权限设计
实现业务系统中的用户权限管理B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。因此B/S业务系统都需要有
Stella981 Stella981
2年前
RocketMQ ACL 使用指南
1、什么是ACL?ACL是accesscontrollist的简称,俗称访问控制列表。访问控制,基本上会涉及到用户、资源、权限、角色等概念,那在RocketMQ中上述会对应哪些对象呢?用户用户是访问控制的基础要素,也不难理解,RocketMQACL必然也会引入用户的概念,即支持用户名、密码。资源资源,需
Stella981 Stella981
2年前
Spring Security使用详解4(基于数据库的URL权限规则配置)
虽然前面我们实现了通过数据库来配置用户与角色,但认证规则仍然是使用HttpSecurity进行配置,还是不够灵活,无法实现资源和角色之间的动态调整。要实现动态配置 URL权限,就需要开发者自定义权限配置,具体步骤如下。四、基于数据库的URL权限规则配置 1、数据库设计这里的数据库在前文(点击查看)的基础上增加一张资
Stella981 Stella981
2年前
Spring Security使用详解2(基于内存的用户、URL权限配置 )
二、基于内存的用户、URL权限配置1、用户角色配置(1)我们可以通过自定义类继承WebSecurityConfigurerAdapter,从而实现对SpringSecurity更多的自定义配置。比如下面样例我们就配置了两个用户,以及他们对应的角色。注意:基于内存的用户配置在配置角色时不需要添加“ROLE\_”前缀,而
Stella981 Stella981
2年前
PHP Laravel5实现的RBAC权限管理操作示例
根据不同的权限,在菜单栏显示不同的功能,只对菜单进行了限制,若对路由也进行限制,可以根据菜单的例子,请自行完善,开发。下面请认真学习一下laravel的RBAC设计1、建表(用户表、角色表、权限表、用户角色表、角色权限表)1CREATETABLEIFNOTEXISTSmr_role2(3id
Easter79 Easter79
2年前
Springmvc+mybatis+shiro+Dubbo+ZooKeeper+Redis+KafKa j2ee分布式架构核心技术
内置功能(只列了一部分功能)1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。5.角色管理:角色菜单权限分配、设置角色按机构进行
Stella981 Stella981
2年前
SSH ++shiro+restful+bootstrap java架构
内置功能(只列了一部分功能)1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。2.机构管理:配置系统组织机构(公司、部门、小组),树结构展现,可随意调整上下级。3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。4.菜单管理:配置系统菜单,操作权限,按钮权限标识等。5.角色管理:角色菜单权限分配、设置角色按机构进行
Wesley13 Wesley13
2年前
MySQL学习(三)主备分库分表和恢复数据
1、MySQL主备切换readonly设置对超级(super)权限是无效的,而用于同步更新的线程,就拥有超级权限。建议在做主备数据库的时候,将备用数据库设置为只读。(反向用readonly来判断节点的角色)主备的同步是通过binlog日志同步,流程:1)、备库上通过changemaster命令,设置主库的
Wesley13 Wesley13
2年前
C 实现基于角色的权限系统
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId1068实例使用C实现基于角色的权限菜单管理系统,管理员可以添加用户,删除用户,添加分组,删除分组,添加角色,删除角色,为角色关联权限等功能,管理员用户自定义各个操作员的权限