查明用户是否有权在 PostgreSQL 中选择/更新/...表/函数/...

2024-05-27

确定用户是否对 PostgreSQL 中的某个类(例如表或函数)拥有特定权限(例如选择或执行)的推荐方法是什么?

此刻我得到了类似的东西

aclcontains(
    someColumnWithAclitemArray,
    makeaclitem(userOid,grantorOid,someRight,false))

但这很糟糕,因为我必须检查每一个grantorOid这是可能的,并且对于每个userOid用户可以属于。

相关说明:您可以测试哪些可能的权利? 我还没有找到任何文档,但阅读源代码我猜:

INSERT
SELECT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
EXECUTE
USAGE
CREATE
CONNECT

似乎还有一个CREATE TEMP是的,但我无法弄清楚在中使用的正确文本makeaclitem-功能。


我发现更好的方法(我似乎记得这是从 psql 内置的一些查询中获取的,或者可能是 information_schema 视图)是使用has_*_privilege函数,并简单地将它们应用于用户和对象的所有可能组合的集合。这还将考虑通过某些组角色访问对象。

例如,这将显示哪些用户有权访问非目录表和视图:

select usename, nspname || '.' || relname as relation,
       case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
       priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
     pg_user,
     (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
      and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
      and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;

可能的特权在描述中详细说明has_*_privilege职能在http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.

“CREATE TEMP”是数据库级权限:它允许用户使用pg_temp_*架构。可以用以下方法进行测试has_database_privilege(useroid, datoid, 'TEMP').

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查明用户是否有权在 PostgreSQL 中选择/更新/...表/函数/... 的相关文章

随机推荐