授予PostgreSQL中特定数据库的权限

Joe*_*app 22 sql database postgresql privileges

我正在从MySQL迁移到PostgreSQL并且已经打破了用户权限.我习惯使用以下命令为用户分配数据库的所有表的所有权限:

# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';
Run Code Online (Sandbox Code Playgroud)

在我看来,PostgreSQL 9.x解决方案涉及为"模式"分配权限,但我需要努力弄清楚究竟要发出什么SQL证明是过分的.我知道再花几个小时的研究会得出答案,但我认为每个从MySQL迁移到PostgreSQL的人都可以从网上至少有一个提供简单完整配方的页面中受益.这是我需要为用户发出的唯一命令.我宁愿不必为每个新表发出命令.

我不知道在PostgreSQL中必须以不同的方式处理哪些场景,所以我将列出我过去通常必须处理的一些场景.假设我们只想修改已创建的单个数据库的权限.

(1a)并非所有表都已创建,或(1b)表已经创建.

(2a)尚未创建用户,或(2b)已创建用户.

(3a)尚未将权限分配给用户,或者(3b)先前已将权限分配给用户.

(4a)用户只需要插入,更新,选择和删除行,或者(4b)用户还需要能够创建和删除表.

我已经看到了为所有数据库授予所有权限的答案,但这不是我想要的.拜托,我正在寻找一个简单的食谱,虽然我也不介意解释.

我不想授予所有用户和所有数据库的权限,因为这似乎是传统的快捷方式,因为当任何一个用户受到攻击时,该方法会破坏所有数据库.我托管多个数据库客户端并为每个客户端分配不同的登录.

看起来我还需要USAGE获得serial列的增加值的权限,但我必须以某种顺序授予它.我的问题变得更复杂了.

Erw*_*ter 52

Postgres的基本概念

角色是可以访问数据库集群中所有数据库的全局对象 - 具有所需的权限.

一个集群拥有许多数据库,持有许多模式.不同DB中的模式(甚至具有相同名称)是不相关的.授予模式的权限仅适用于当前数据库中的此特定模式(授予时的当前数据库).

public默认情况下,每个数据库都以模式开头.这是一个惯例,许多设置都以它开头.除此之外,架构public只是一个与其他架构一样的架构.

来自MySQL,您可能希望从单个模式开始public,有效地完全忽略模式层.我定期为每个数据库使用几十个模式.
模式在文件系统中有点(但不完全)类似于目录.

一旦您使用了多个模式,请务必了解search_path设置:

默认权限

每个文档GRANT:

PostgreSQL为某些类型的对象授予默认权限 PUBLIC.PUBLIC默认情况下,不对表,列,模式或表空间授予任何权限.对于其他类型,默认权限授予PUBLIC如下:CONNECTCREATE TEMP TABLE 为数据库; EXECUTE职能特权; 和USAGE语言特权.

所有这些默认值都可以通过以下方式更改ALTER DEFAULT PRIVILEGES:

小组角色

与@Craig评论一样,最好是GRANT授予组角色权限,然后创建该角色的特定用户成员(GRANT组角色为用户角色).这样,处理和撤销某些任务所需的特权束就更简单了.

组角色只是没有登录的另一个角色.添加登录名以将其转换为用户角色.更多:

食谱

比如,我们有一个新的数据库mydb,一个组mygrp和一个用户myusr......

虽然以超级用户身份连接到相关数据库(postgres例如):

REVOKE ALL ON DATABASE mydb FROM public;  -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp;  -- since we revoked from public

GRANT USAGE ON SCHEMA public TO mygrp;
Run Code Online (Sandbox Code Playgroud)

a user all privileges to all tables像你写的那样分配(我可能更具限制性):

GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
Run Code Online (Sandbox Code Playgroud)

要为将来的对象设置默认权限,请为在此模式中创建对象的每个角色运行:

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;

ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;

-- more roles?
Run Code Online (Sandbox Code Playgroud)

现在,将该组授予用户:

GRANT mygrp TO myusr;
Run Code Online (Sandbox Code Playgroud)

相关回答:

替代(非标准)设置

来自MySQL,并且由于您希望保持数据库分离的权限,您可能会喜欢这种非标准设置db_user_namespace.每个文件:

此参数启用每个数据库的用户名.它默认是关闭的.

请仔细阅读本手册.我不使用此设置.它并没有使上述内容无效.

  • 不值得一个单独的答案,但我还想补充说,一般来说,你不应该对个人用户"感恩".而是创建角色(组)并授予他们对表的权限.在创建用户时将用户添加到角色.这将为您节省很多管理上的痛苦. (6认同)
  • @CraigRinger:没错.以下是演示代码的相关答案:http://stackoverflow.com/questions/15867175/postgresql-db-user-should-only-be-allowed-to-call-functions/15868268#15868268 (2认同)
  • 只是想添加一个说明。默认情况下,在数据库中创建资源的用户拥有该资源的所有权限。“ALTER DEFAULT PRIVILEGES”的目的是让其他用户也可以访问该资源。在此示例中,这是通过向“mygrp”授予“myusr”创建的所有资源的权限来完成的。AWS 文档中有一句话让我明白了:“定义要应用于将来*由指定用户*创建的对象的默认访问权限集”(我的重点)。http://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_DEFAULT_PRIVILEGES.html (2认同)