【问题标题】:Cannot make granting access to existing tables work无法授予对现有表的访问权限
【发布时间】:2018-11-13 15:00:13
【问题描述】:

我未能添加新的数据库角色,该角色将对特定数据库中的表拥有SELECT 权限。

我的问题是该角色无法从现有数据库中的表中SELECT

这是我失败的测试用例(编写后可以安全地复制粘贴到/tmp/test.sh 并执行):

# --- cleanup objects, if any
psql -U postgres -c "REVOKE SELECT ON ALL SEQUENCES IN SCHEMA public FROM db_reader"
psql -U postgres -c "REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM db_reader"
psql -U postgres -c "REVOKE USAGE ON SCHEMA public FROM db_reader"
psql -U postgres -c "DROP ROLE IF EXISTS db_reader"
psql -U postgres -c "DROP DATABASE IF EXISTS some_existing_db"
# --- test
psql -U postgres -c "CREATE DATABASE some_existing_db"
psql -U postgres some_existing_db -c "CREATE TABLE cats (name varchar(10))"
psql -U postgres some_existing_db -c "INSERT INTO cats (name) VALUES ('a'), ('b')"
psql -U postgres -c "CREATE ROLE db_reader WITH login"
psql -U postgres -c 'GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO db_reader'
psql -U postgres -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO db_reader'
psql -U postgres -c 'GRANT USAGE ON SCHEMA public TO db_reader'
psql -U db_reader some_existing_db -c "SELECT COUNT(1) FROM cats"

看起来我在这里遗漏了一些非常令人尴尬的东西,因为上面失败并出现以下错误

ERROR:  permission denied for relation cats

为什么?

【问题讨论】:

    标签: sql postgresql roles rbac


    【解决方案1】:

    您错过了数据库在逻辑上是分开的。

    您的GRANT 语句在数据库postgres 中执行(如果您未指定数据库名称,psql 将尝试连接到与数据库用户同名的数据库)。

    因此,这些授权的影响仅限于您所连接的数据库。

    您必须将some_existing_db 添加到您授予db_reader 权限的psql 调用中。

    【讨论】:

    • 谢谢你,劳伦兹。我在发布问题后不久就想到了自己,但将其留给其他人尝试回答并解释为什么会发生这种情况。我从来没有想过 GRANT 的范围仅限于当前上下文,例如我从中发行它们的数据库。
    • 我刚刚再次查看了GRANT 页面,并没有说明GRANTs 的范围仅限于发出它们的数据库。你知道我在哪里可以了解更多吗?我很幸运地从 PostgreSQL 邮件列表中的 email 偶然了解到这一点。
    • 很有趣,我在文档中找不到它。事实上,all SQL 语句只能影响全局对象或您所连接的数据库中的对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 2018-06-10
    • 1970-01-01
    相关资源
    最近更新 更多