用好PostgreSQL role membership来管理继承组权限

用好PostgreSQL role membership来管理继承组权限

作者

digoal

日期

2016-11-14

标签

PostgreSQL , role , 角色 , membership , inherit , 权限继承


背景

在数据库中,如果你想把A用户创建的对象权限赋予给B用户,或者其他用户。

通常我们会对需要赋权的对象使用grant的语法来赋权。

但是这种方法比较繁琐,因为需要对每个对象,每一组需要的权限进行赋权。

如果你需要整个A用户所有对象的权限,以及它将来创建的对象的所有权限,有没有好的方法呢?

没错,你一定会想到role来管理。

role membership & inherit

例子

数据库有一个a 用户,创建了一些对象,需求是把a 创建的对象,自动赋予给b 用户。

创建a用户
postgres=# create role a login;
CREATE ROLE

创建b用户
postgres=# create role b login;
CREATE ROLE

把a赋予给b
postgres=# grant a to b;
GRANT ROLE

查看membership,可以看到b是a的member
postgres=# \du+ a
                  List of roles
 Role name | Attributes | Member of | Description
-----------+------------+-----------+-------------
 a         |            | {}        | 

postgres=# \du+ b
                  List of roles
 Role name | Attributes | Member of | Description
-----------+------------+-----------+-------------
 b         |            | {a}       | 

使用a连接数据库,创建一张表
postgres=# \c postgres a
You are now connected to database "postgres" as user "a".
postgres=> create table r1(id int);
CREATE TABLE

使用b连接数据库,可以直接使用这张表
postgres=> \c postgres b
You are now connected to database "postgres" as user "b".
postgres=> insert into r1 values (1);
INSERT 0 1
postgres=> \d+ r1
                          Table "public.r1"
 Column |  Type   | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
 id     | integer |           | plain   |              | 

postgres=> \dt+ r1
                    List of relations
 Schema | Name | Type  | Owner |    Size    | Description
--------+------+-------+-------+------------+-------------
 public | r1   | table | a     | 8192 bytes |
(1 row)

如果b用户为noinherit的,那么需要set role才能切换到对应的role.

将b设置为noinherit
postgres=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# alter role b noinherit;
ALTER ROLE

那么b不会自动继承a这个角色,需要显示的set role a;
postgres=# \c postgres b
You are now connected to database "postgres" as user "b".
postgres=> insert into r1 values (1);
ERROR:  permission denied for relation r1

postgres=> set role a;
SET
postgres=> insert into r1 values (1);
INSERT 0 1

另一种加入member的方法是在创建角色时加入,可以一次指定多个.

postgres=# create role c  in role a login;
CREATE ROLE
postgres=# \du+ c
                  List of roles
 Role name | Attributes | Member of | Description
-----------+------------+-----------+-------------
 c         |            | {a}       | 

d用户登陆后,会自动继承a,b的权限
postgres=# create role d  in role a,b login;
CREATE ROLE
postgres=# \du+ d
                  List of roles
 Role name | Attributes | Member of | Description
-----------+------------+-----------+-------------
 d         |            | {a,b}     |

WITH ADMIN OPTION

与SQL标准一样,加了WITH ADMIN OPTION 则允许被授予的用户继续将权限授予给其他人。

postgres=# grant a to b with admin option;
GRANT ROLE

postgres=# \c postgres b
You are now connected to database "postgres" as user "b".

postgres=> grant a to digoal;
GRANT ROLE

postgres=> \c postgres c
You are now connected to database "postgres" as user "c".

postgres=> grant a to digoal;
ERROR:  must have admin option on role "a"

default privilege

使用角色继承来管理有些时候还是不能满足业务需求,因为业务可能只是想把少量的权限给其他用户,而不是所有权限。

例如,使用角色继承的方法是比较危险的,被授予权限的用户,可以删除对象。

postgres=# alter role b inherit;
ALTER ROLE
postgres=# \c postgres b
You are now connected to database "postgres" as user "b".
postgres=> \dt+ r1
                    List of relations
 Schema | Name | Type  | Owner |    Size    | Description
--------+------+-------+-------+------------+-------------
 public | r1   | table | a     | 8192 bytes |
(1 row)

postgres=> drop table r1;
DROP TABLE

如果只想要a用户将来创建的所有表的查询权限,怎么做呢?

Command:     ALTER DEFAULT PRIVILEGES
Description: define default access privileges
Syntax:
ALTER DEFAULT PRIVILEGES
    [ FOR { ROLE | USER } target_role [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    abbreviated_grant_or_revoke

where abbreviated_grant_or_revoke is one of:

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTIONS
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON TYPES
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]

REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON TABLES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { { USAGE | SELECT | UPDATE }
    [, ...] | ALL [ PRIVILEGES ] }
    ON SEQUENCES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON FUNCTIONS
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { USAGE | ALL [ PRIVILEGES ] }
    ON TYPES
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ]

例子

postgres=# alter default privileges for role a grant select on tables to b;
ALTER DEFAULT PRIVILEGES

postgres=# \c postgres a
You are now connected to database "postgres" as user "a".
postgres=> create table r1(id int);
CREATE TABLE
postgres=> insert into r1 values (1);
INSERT 0 1
postgres=> \c postgres b
You are now connected to database "postgres" as user "b".
postgres=> select * from r1;
 id
----
  1
(1 row)

参考

https://www.postgresql.org/docs/9.6/static/sql-alterdefaultprivileges.html

https://www.postgresql.org/docs/9.6/static/sql-createrole.html

https://www.postgresql.org/docs/9.6/static/sql-grant.html

时间: 2024-12-31 19:33:12

用好PostgreSQL role membership来管理继承组权限的相关文章

PostgreSQL教程(十二):角色和权限管理介绍_PostgreSQL

PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户.角色可以拥有数据库对象,如表.索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些对象拥有哪些权限.     一.数据库角色:     1. 创建角色:   复制代码 代码如下:     CREATE ROLE role_name;       2. 删除角色:   复制代码 代码如下:     DROP ROLE role_name;         3. 查询角色:

一天学会PostgreSQL应用开发与管理 - 2 Linux基本操作

背景 玩转PostgreSQL前,首先要了解的最最基本的Linux操作. 本章大纲 1. 如何访问命令行 2. 使用命令行下的工具 非编辑模式 进入编辑模式 3. 正则表达式.管道和I/O 重定向 4. 管理用户账户 5. 文件访问控制 6. 管理进程 1, 如何访问命令行 1.1 本地命令行的访问 在图形界面中,访问命令行的方法:打开Terminal,Console. 或者:Ctrl+Alt+F1 ~ F6 1.2 使用SSH 访问命令行 同上 2, 使用命令行下的工具 2.1 使用硬链接 硬

.net2.0中的membership实现的是资源权限管理对吗?

问题描述 .net2.0中的membership实现的是资源权限管理对吗?我设置角色的时候,系统是对指定文件夹下面加个web.config,denyroles="roleA"也就是对文件夹访问进行限制,但不会登陆的用户对数据库进行删除等操作进行限制 解决方案 解决方案二:呵呵,你说那个是对的哈,最近也在用这个,不过觉得membership还是有不好用的地方,它好像没有提供给角色授权页面的方法,只能自己写方法去修改web.congfig,或者是在iis里面去设置.解决方案三:是啊,我到处

利用A、G、DL、P策略来管理网络资源访问权限

如现在某个企业是通过域来管理的.在域中,有三台打印机,其中,销售部门只能够访问打印机A;管理部门只能够使用打印机B;财务部门可以访问打印机C,当打印机C不能够使用时,则可以使用打印机B.在域中,还有三个共享文件夹,其中文件夹甲是销售部门专用文件夹,只有销售员工以及销售总监与财务总监可以访问;文件夹乙是财务专用文件夹,只有财务部门以及财务总监帐户可以访问;文件夹丙是一个公共文件夹,任何部门员工都可以访问.针对这种应用的话,该如何来管理帐户的访问权限呢?最简单也就是最原始的方法,就是没每个帐户设置访

Windows Server 2003更改继承的权限设置

Active Directory提供了一系列集中组织 管理和访问网络资源的目录服务功能.Active Directory使网络拓扑和协议对用户变得透明,从而使网络上的用户可以访问任何资源(例如打印机),而无需知道该资源的位置以及它是如何连接到网络的.&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; Active Directory被划分成区域进行管理,这使其可以存储大量的对象.基于这种结构,Active Direc

windows server 2008 R2/windows 7管理二 组策略之控管USB及QQ等

上篇我们基本的应用已经有了,有兄弟说我的东西太基础了,哈,高楼都是从基础开始建的,其实我也有点迷惑,基础了嫌我写基础了,写点高深的又没人看.不过不管怎样,我还是会坚持自己的风格,我更希望的是我能起到一个抛砖引玉的作用,而不是一个讲师,什么玩意都告诉你们,怎么去折腾怎样怎样的,古人有云:"授人以鱼不如授人以渔"这句话用在如今的IT行业也很合适,我经常在论坛看见有求助的网友恨不得回答的人所有的都包办了,缺乏思考和自我学习. 这是一种悲哀. 本篇仅为列举2个例子一个封锁qq,一个封锁USB,

windows2008-请问下有什么命令可以取消包括可从该对象的父项继承的权限这个选项的勾起

问题描述 请问下有什么命令可以取消包括可从该对象的父项继承的权限这个选项的勾起 请问下有什么命令可以取消包括可从该对象的父项继承的权限这个选项的勾起 操作系统是:Windows 2008 R2 如图: 网站目录结构如下:E:wwwroot2014111E:wwwroot2014112E:wwwroot20141131E:wwwroot2014121E:wwwroot2014122 就是目录2014下面的所有二级目录.三级目录.都不需要继承上级目录的权限.而且文件夹只需要保留图中的2个帐户的权限.

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装    (5):前台Jquery easyUI实现    (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一     (9):TT摸版的学习    (10):V

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装          (5):前台Jquery easyUI实现   (6):EF上下文实例管理    (7):DBSession的封装   (8):DBSession线程内唯一