【问题标题】:How to enumerate all enabled roles for all users in PostgreSQL?如何枚举 PostgreSQL 中所有用户的所有启用角色?
【发布时间】:2020-09-22 01:23:26
【问题描述】:

如果您想检查用户有权访问的角色,PostgreSQL 中没有简单的方法。在information_schema 中有关系enabled_rolesapplicable roles,但它们只提供current_user 的权限。那么我如何才能访问 any 用户的相同信息?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    诀窍是对系统目录关系pg_rolespg_auth_members进行递归查询:

    WITH RECURSIVE membership_tree(grpid, userid) AS (
        -- Get all roles and list them as their own group as well
        SELECT pg_roles.oid, pg_roles.oid
        FROM pg_roles
      UNION ALL
        -- Now add all group membership
        SELECT m_1.roleid, t_1.userid
        FROM pg_auth_members m_1, membership_tree t_1
        WHERE m_1.member = t_1.grpid
    )
    SELECT DISTINCT t.userid, r.rolname AS usrname, t.grpid, m.rolname AS grpname
    FROM membership_tree t, pg_roles r, pg_roles m
    WHERE t.grpid = m.oid AND t.userid = r.oid
    ORDER BY r.rolname, m.rolname;
    

    这提供了系统中具有所有继承角色成员资格的所有用户的视图。将其包装在视图中,以便始终使用此实用程序。

    干杯, 帕特里克

    【讨论】:

      【解决方案2】:

      这非常有帮助,因为我正在寻找这类信息。调整上面的工作以包含一个级别来跟踪继承

      WITH RECURSIVE membership_tree(grpid, userid, lvl) AS (
      -- Get all roles and list them as their own group as well
      SELECT 
          pg_roles.oid
          , pg_roles.oid
          , 0
      FROM
          pg_roles
      
      UNION ALL
      
      -- Now add all group membership
      SELECT 
          m_1.roleid
          , t_1.userid
          , lvl + 1
      FROM
          pg_auth_members m_1
      INNER JOIN
          membership_tree t_1 
      ON
          m_1.member = t_1.grpid
      )
      SELECT DISTINCT
          t.userid
          , r.rolname AS usrname
          , t.grpid
          , m.rolname AS grpname
          , t.lvl
      FROM
          membership_tree t
      INNER JOIN
          pg_roles r
      ON
          t.userid = r.oid
      INNER JOIN
          pg_roles m
      ON
          t.grpid = m.oid
      ORDER BY
          r.rolname
          , t.lvl
          , m.rolname;
      

      【讨论】:

        猜你喜欢
        • 2018-09-29
        • 2023-03-21
        • 1970-01-01
        • 2023-03-19
        • 2010-12-01
        • 2019-04-07
        • 2010-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多