gpt4 book ai didi

postgresql - 检索特定角色的所有对象权限

转载 作者:行者123 更新时间:2023-11-29 11:13:14 27 4
gpt4 key购买 nike

是否有一种简单的方法来枚举特定角色具有某些访问权限的所有对象?我知道 pg_catalog 中的一组 has_*_privilege 函数,但它们没有完成这项工作,我想以相反的方式工作。实际上,我希望有一个 View 为特定角色提供 oid 和存储在 pg_class 中的任何内容的访问权限。

这样的 View 对于检查数据库的安全设置是否正确非常方便。通常,角色比关系少得多,因此恕我直言,检查角色要轻松得多。标准 PostgreSQL 发行版中不应该提供这样的实用程序吗?

根据源代码(acl.h),aclitem 是一个结构:

typedef struct AclItem
{ Oid ai_grantee; /* ID that this item grants privs to */
Oid ai_grantor; /* grantor of privs */
AclMode ai_privs; /* privilege bits */
} AclItem;

易于使用。但是,pg_type 将其列为用户定义的非复合类型。这是为什么?我现在看到的唯一方法是使用字符串函数解析 aclitem[] 数组。有没有更好的方法来分析 aclitem 数组?

添加信息浏览各种 PG 列表,很明显这个问题至少自 1997 年以来一直以各种形式出现(那时我们有电脑吗?有电视吗?),最相关的讨论主题是“Binary in/out for aclitem”在 2011 年初的 pgsql-hackers 上。作为 PG 的(技术熟练的)用户 - 而不是黑客 - 我很欣赏开发人员对维护稳定界面的关注,但线程中表达的一些关注有点远我的口味。系统目录中没有定义等于源代码中 AclItem 结构的 pg_acl 表的真正原因是什么?该结构最后一次更改是什么时候?我也知道 SE 的发展可能会改变安全处理的方式 - 当用户选择时,大概 - 所以我会满足于以这种方式呈现 acl 信息的东西,以便很容易枚举授予的特权特定用户,例如:

SELECT * FROM pg_privileges WHERE grantee = 16384;

像这样,它仍然可以是底层结构的抽象,因此引擎盖下的任何更改(大概)仍然可以转换为公开的接口(interface)。我会说,与 information_schema 方法没有太大区别。

干杯,帕特里克

最佳答案

没有开箱即用的 View ,但创建它所需的数据在系统目录中:

http://www.postgresql.org/docs/current/static/catalogs.html

比如pg_class中有一个relacl字段:

select oid::regclass, relacl from pg_class;

其他目录中也有类似的字段,即pg_type中的typaclpg_proc中的proacl

您可能想要使用另外两个目录,即 pg_authid 来了解哪些角色具有 super 用户权限,以及 pg_auth_members 来了解谁拥有什么角色。

(pg_default_acl 仅在对象创建期间使用,因此没有用。)

有几个与 aclitem 相关的内部函数可以在创建 View 时派上用场。您可以像这样在 psql 中列出它们:

\df+ *acl*

特别是 acleexplode()。希望以下示例足以帮助您入门:

select oid::regclass,
(aclexplode(relacl)).grantor,
(aclexplode(relacl)).grantee,
(aclexplode(relacl)).privilege_type,
(aclexplode(relacl)).is_grantable
from pg_class
where relacl is not null;

可以通过先扩展acl行来优化,例如:

select oid::regclass,
aclitem.grantee
from (select oid, aclexplode(relacl) as aclitem from pg_class) sub

它将直接引导您获得所需的结果。

据我所知,这与使用内置工具一样好。 (当然,如果您想进一步优化它,您可以在 C 中编写自己的一组运算符。)

关于您的额外问题,恐怕世界上只有少数人能够回答这些问题,也就是核心开发者自己。他们出现在 pg 黑客名单上的次数比在这里多。

关于postgresql - 检索特定角色的所有对象权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22315030/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com