开发者社区> 问答> 正文

PG有没有角色禁用或启用的权限?

PG有没有角色禁用和启用的权限?

展开
收起
被纵养的懒猫 2019-09-11 13:43:41 1174 0
1 条回答
写回答
取消 提交回答
  • Pg权限分为两部分,一部分是“系统权限”或者数据库用户的属性,可以授予role或user(两者区别在于login权限);一部分为数据库对象上的操作权限。对超级用户不做权限检查,其它走acl。对于数据库对象,开始只有所有者和超级用户可以做任何操作,其它走acl。在pg里,对acl模型做了简化,组和角色都是role,用户和角色的区别是角色没有login权限。

    可以用下面的命令创建和删除角色,

    CREATE ROLE name;

    DROP ROLE name;

    为了方便,也可以在 shell 命令上直接调用程序 createuser 和 dropuser,这些工具对相应命令提供了封装:

    createuser name

    dropuser name

    数据库对象上的权限有:SELECT,INSERT, UPDATE,DELETE,RULE, REFERENCES,TRIGGER,CREATE,TEMPORARY,EXECUTE,和 USAGE等,具体见下面定义

    typedefuint32AclMode; /* a bitmask of privilege bits */

    #define ACL_INSERT (1<<0) /* forrelations */

    #defineACL_SELECT (1<<1)

    #defineACL_UPDATE (1<<2)

    #defineACL_DELETE (1<<3)

    #defineACL_TRUNCATE (1<<4)

    #defineACL_REFERENCES (1<<5)

    #defineACL_TRIGGER (1<<6)

    #defineACL_EXECUTE (1<<7) /* for functions */

    #defineACL_USAGE (1<<8) /* for languages, namespaces, FDWs, and

                                 * servers */
    

    #defineACL_CREATE (1<<9) /* for namespaces and databases */

    #defineACL_CREATE_TEMP (1<<10) /* for databases */

    #defineACL_CONNECT (1<<11) /* for databases */

    #defineN_ACL_RIGHTS 12 /* 1plus the last 1<<x */

    #defineACL_NO_RIGHTS 0

    /*Currently, SELECT ... FOR UPDATE/FOR SHARE requires UPDATE privileges */

    #defineACL_SELECT_FOR_UPDATE ACL_UPDATE

    我们可以用特殊的名字 PUBLIC 把对象的权限赋予系统中的所有角色。 在权限声明的位置上写 ALL,表示把适用于该对象的所有权限都赋予目标角色。

    beigang=# grantall on schema csm_ca to public;

    GRANT

    beigang=# revoke all on schema csm_ca frompublic;

    REVOKE

    beigang=#

    每种对象的all权限定义如下:

    /*

    • Bitmasks defining "allrights" for each supported object type

    */

    #defineACL_ALL_RIGHTS_COLUMN (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_REFERENCES)

    #defineACL_ALL_RIGHTS_RELATION (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_DELETE|ACL_TRUNCATE|ACL_REFERENCES|ACL_TRIGGER)

    #defineACL_ALL_RIGHTS_SEQUENCE (ACL_USAGE|ACL_SELECT|ACL_UPDATE)

    #defineACL_ALL_RIGHTS_DATABASE (ACL_CREATE|ACL_CREATE_TEMP|ACL_CONNECT)

    #define ACL_ALL_RIGHTS_FDW (ACL_USAGE)

    #defineACL_ALL_RIGHTS_FOREIGN_SERVER (ACL_USAGE)

    #defineACL_ALL_RIGHTS_FUNCTION (ACL_EXECUTE)

    #defineACL_ALL_RIGHTS_LANGUAGE (ACL_USAGE)

    #defineACL_ALL_RIGHTS_LARGEOBJECT (ACL_SELECT|ACL_UPDATE)

    #defineACL_ALL_RIGHTS_NAMESPACE (ACL_USAGE|ACL_CREATE)

    #defineACL_ALL_RIGHTS_TABLESPACE (ACL_CREATE)

    用户的属性可参见下图:

    视图 pg_roles提供访问数据库角色有关信息的接口。 它只是一个 pg_authid 表的公开可读部分的视图,把口令字段用空白填充了。

    Table 42-39.pg_roles字段

    image.png

    下面实验验证

    先创建一个角色xxx,再创建一个超级用户csm、普通用户csm_ca,csm用户创建一个数据库testdb,在这个数据库里创建一个schema:csm_ca,然后赋予普通用户csm_ca操作数据库testdb里schema:csm_ca里的表的权限。

    1

    Create role:

    testdb=# create role xxx with superuser;

    CREATE ROLE

    2

    Create user:

    testdb=# create user csm with superuserpassword 'csm';

    CREATE ROLE

    testdb=# create user csm_ca with password 'csm_ca';

    CREATE ROLE

    testdb=#

    3

    验证

    testdb=# \du

    角色列表

    -[ RECORD 1]--------------------------------------

    角色名称 | csm

    属性 | 超级用户

    成员属于 | {}

    -[ RECORD 2]--------------------------------------

    角色名称 | csm_ca

    属性 |

    成员属于 | {}

    -[ RECORD 3 ]--------------------------------------

    角色名称 | postgres

    属性 | 超级用户, 建立角色, 建立 DB, Replication

    成员属于 | {}

    -[ RECORD 4]--------------------------------------

    角色名称 | xxx

    属性 | 超级用户, 无法登录

    成员属于 | {}

    testdb=# SELECT * FROM pg_roles;

    -[ RECORD 1 ]---------+---------

    rolname | postgres

    rolsuper | t

    rolinherit | t

    rolcreaterole | t

    rolcreatedb | t

    rolcreatedblink | t

    rolcreatepublicdblink | t

    roldroppublicdblink | t

    rolcatupdate | t

    rolcanlogin | t

    rolreplication | t

    rolconnlimit | -1

    rolpassword | ********

    rolvaliduntil |

    rolconfig |

    oid | 10

    -[ RECORD 2 ]---------+---------

    rolname | csm

    rolsuper | t

    rolinherit | t

    rolcreaterole | f

    rolcreatedb | f

    rolcreatedblink | f

    rolcreatepublicdblink | f

    roldroppublicdblink | f

    rolcatupdate | t

    rolcanlogin | t

    rolreplication | f

    rolconnlimit | -1

    rolpassword | ********

    rolvaliduntil |

    rolconfig |

    oid | 24598

    -[ RECORD 3 ]---------+---------

    rolname | csm_ca

    rolsuper | f

    rolinherit | t

    rolcreaterole | f

    rolcreatedb | f

    rolcreatedblink | f

    rolcreatepublicdblink | f

    roldroppublicdblink | f

    rolcatupdate | f

    rolcanlogin | t

    rolreplication | f

    rolconnlimit | -1

    rolpassword | ********

    rolvaliduntil |

    rolconfig |

    oid | 24599

    -[ RECORD 4 ]---------+---------

    rolname | xxx

    rolsuper | t

    rolinherit | t

    rolcreaterole | f

    rolcreatedb | f

    rolcreatedblink | f

    rolcreatepublicdblink | f

    roldroppublicdblink | f

    rolcatupdate | t

    rolcanlogin | f

    rolreplication | f

    rolconnlimit | -1

    rolpassword | ********

    rolvaliduntil |

    rolconfig |

    oid | 24600

    image.png

    postgres=# \c beigang

    You are now connected to database "beigang" as user "csm".

    5

    Csm用户在beigang里创建schema: csm_ca

    beigang=#

    beigang=#

    beigang=# create schema csm_ca;

    CREATE SCHEMA

    beigang=#

    image.png

    6

    验证模式csm_ca和用户csm_ca

    beigang=# \dn

    架构模式列表

    名称 | 拥有者

    --------+----------

    csm_ca | csm

    dbo | postgres

    public | postgres

    sys | postgres

    (4 行记录)

    beigang=# \du

                            角色列表
    

    角色名称 | 属性 | 成员属于

    ----------+------------------------------------------+----------

    csm | 超级用户 | {}

    csm_ca | | {}

    postgres | 超级用户, 建立角色, 建立 DB, Replication | {}

    xxx | 超级用户, 无法登录 | {}

    beigang=#

    7

    超级用户csm给普通用户csm_ca授予操作schema csm_ca的权限

    beigang=# grant all on schema csm_ca to csm_ca;

    GRANT

    beigang=# grant all on all tables in schema csm_ca to csm_ca;

    GRANT

    beigang=#

    8

    pg中组就是role,操作见以下

    beigang=# grant xxx to csm_ca;

    GRANT ROLE

    beigang=# revoke xxx from csm_ca;

    REVOKE ROLE

    beigang=#

    2019-09-11 13:47:30
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
《用管控策略设定多账号组织全局访问边界》 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载