检查模式 postgresql 上的用户访问权限
Posted
技术标签:
【中文标题】检查模式 postgresql 上的用户访问权限【英文标题】:check user access on schema postgresql 【发布时间】:2018-07-31 16:25:32 【问题描述】:我查看了 GRANT Found here(https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html) 的文档,并试图查看是否有一个内置函数可以让我查看数据库中的可访问性级别。当然有:
\dp 和 \dp 我的表名
但这并没有显示我的帐户可以访问的内容。我想查看我有权访问的所有模式或用户。谁能告诉我是否有一个命令可以检查我在 Postgres/Redshift 中的访问级别(我是否有 CREATE、USAGE 权限)?如果是这样,那将是什么命令?数据库也一样(我是否有 CREATE、TEMP、TEMPORARY 权限)
【问题讨论】:
【参考方案1】:确保您熟悉 Postgres 用于用户/角色的模型: 来自the Postgres documentation
PostgreSQL 使用角色的概念管理数据库访问权限。一个角色可以被认为是一个数据库用户或一组数据库用户,这取决于角色的设置方式。角色可以拥有数据库对象(例如,表和函数),并且可以将这些对象的权限分配给其他角色,以控制谁可以访问哪些对象
因此,您应该考虑“用户 X 分配了哪些角色,这些角色可以访问哪些对象(以及访问的类型)?”同时记住 user X 也是一个角色。
还要记住,“模式”和“数据库”是命名空间,而不是对象。表和列是对象。询问模式/数据库权限不会很有用,因为这些不是应用权限的对象。
试试这个实验:
-
设置一个测试数据库,并创建一个新模式。将测试表添加到架构中,并创建测试用户。
查看pg_namespace、table_privileges、role_column_grants、column_privileges、role_table_grants的内容。
将架构上的 USAGE 授予测试用户。再看看那些表。
将 SELECT 授予表,然后再查看相同的表。
您应该注意到,授予 USAGE 只会将测试用户添加到命名空间。授予 select 应该对实际的数据库对象(表)应用权限。
您可能正在寻找这样的东西:
select * from information_schema.role_table_grants
可能还有其他角色_表:
information_schema.role_column_grants
information_schema.role_routine_grants
information_schema.role_table_grants
information_schema.role_udt_grants
information_schema.role_usage_grants
【讨论】:
我想要用户对模式和数据库的特定权限,而不是像我们使用 SELECT table_catalog, table_schema, table_name, privilege_type FROM information_schema.table_privileges WHERE grantee = username;我试图为模式和数据库获取相同的数据 “schema”和“database”是命名空间,而不是对象。表和列是对象。询问模式/数据库权限不会很有用,因为这些不是应用权限的对象。试试这个实验:设置一个测试数据库,并创建一个新模式、一个测试表和一个测试用户。现在看pg_namespace、table_privileges、role_column_grants、column_privileges、role_table_grants的内容。现在,将架构上的 USAGE 授予测试用户。再看看那些表。现在将 select 授予表,并再次查看相同的表。 现在,话虽如此,您当然可以编写 SQL 来聚合我在我的回答/上一条评论中命名的表的内容,只要记住 Postgres 用于角色和权限的框架数据库对象。 感谢 Z4-tier 非常有帮助。它们不是对象,所以我将通过查询您提到的表来检索它 谢谢,我将 cmets 添加到答案本身。如果这是您所要求的,您应该接受这个答案。以上是关于检查模式 postgresql 上的用户访问权限的主要内容,如果未能解决你的问题,请参考以下文章