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

时间:2014-07-23 18:40:20

标签: sql database postgresql privileges

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

# MySQL
grant all privileges on mydatabase.* to 'myuser'@'localhost' identified by 'mypassword';

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

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

  

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

     

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

     

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

     

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

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

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

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

4 个答案:

答案 0 :(得分:50)

Postgres的基本概念

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

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

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

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

使用多个架构后,请务必了解search_path设置:

默认权限

Per documentation on GRANT:

  

PostgreSQL为某些类型的对象授予默认权限   PUBLIC。默认情况下,表{1}没有授予任何权限,   列,模式或表空间。对于其他类型,默认值   授予PUBLIC的权限如下:PUBLICCONNECT   数据库; CREATE TEMP TABLE职能特权;和EXECUTE语言特权。

所有这些默认值都可以使用ALTER DEFAULT PRIVILEGES更改:

小组角色

Like @Craig commented,最好是USAGE对组角色的权限,然后使该角色的特定用户成员(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; (我可能更具限制性):

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

现在,将该组授予用户:

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?

相关答案:

替代(非标准)设置

来自MySQL,并且由于您希望保持数据库分离的权限,您可能会喜欢这种非标准设置GRANT mygrp TO myusr; Per documentation:

  

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

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

答案 1 :(得分:1)

  

也许您可以给我一个授予特定用户的示例   在所有表上选择/插入/更新/删除 - 那些是否存在   还是创建了一个特定的数据库?

你称之为MySQL的数据库更像是PostgreSQL模式,而不是PostgreSQL数据库。

连接数据库"测试"作为超级用户。这就是

$ psql -U postgres test

Change the default privileges适用于现有用户" tester"。

ALTER DEFAULT PRIVILEGES IN SCHEMA public
    GRANT INSERT, SELECT, UPDATE, DELETE ON TABLES
    TO tester;

更改默认权限对现有表没有影响。这是设计的。对于现有表,请使用标准GRANT和REVOKE语法。

您无法为不存在的用户分配权限。

答案 2 :(得分:1)

  

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

确定。将表分配给正确的角色时,授予的权限将是特定于角色的,而不是所有用户!然后,您可以决定将roles提供给谁。

  1. 为每个数据库创建一个role。角色可以容纳许多用户。
  2. 然后将client-username分配给正确的角色。
  3. 如果需要,还可以为每个角色分配your-username

  4.   

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

    确定。您可以稍后创建表格。
    准备就绪后,将表分配给正确的客户端role

    CREATE TABLE tablename();
    CREATE ROLE rolename;
    ALTER TABLE tablename OWNER TO rolename;
    


      

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

    确定。准备好后创建用户名。如果您的客户需要多个用户名,只需创建第二个client-username

    CREATE USER username1;
    CREATE USER username2;
    


      

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

    确定。当您准备好提供权限时,请创建用户并为其分配正确的角色。
    使用GRANT-TO命令为用户分配角色。

    GRANT rolename TO username1;
    GRANT rolename TO username2;
    


      

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

    确定。您可以运行这些命令来为用户添加权限。

    GRANT SELECT, UPDATE, INSERT, DELETE ON dbname TO role-or-user-name;
    ALTER USER username1 CREATEDB;
    

答案 3 :(得分:0)

如果您只使用PUBLIC,则可以忘记架构。 然后你做这样的事情:( see doc here

GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
    [, ...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
         | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
相关问题