选择当前角色的数据库作为非超级用户

时间:2015-01-01 15:53:20

标签: postgresql

Postgresql 9.1

我有一个多租户解决方案,其中一个或多个数据库由角色(租户)拥有。

以超级用户身份登录时,此方法有效:

SELECT datname FROM pg_database
JOIN pg_authid ON pg_database.datdba = pg_authid.oid
WHERE rolname = current_user

但是作为租户登录我收到错误:pg_autid

的权限被拒绝

租户是这样创建的:

CREATE ROLE 'tenant1' WITH PASSWORD '12345' LOGIN

奇怪的是,租户1可以看到所有其他数据库:

SELECT datname FROM pg_database

我的问题是:

  1. 如何以安全的方式列出属于某个租户的所有数据库?
  2. 有没有更好的方法让这个多租户解决方案更安全?
  3. 我知道我可以以超级用户身份登录,列出租户的数据库,然后以租户身份登录。但我正在寻找一个更简单的解决方案。有些数据显然可以作为受限租户访问,因为我可以列出所有pg_database。

    我搜索了所有档案,但未找到任何适用的解决方案。

    提前感谢任何线索!

1 个答案:

答案 0 :(得分:0)

每个用户都应该可以访问函数pg_get_userbyid()

SELECT datname 
FROM pg_database
WHERE pg_get_userbyid(datdba) = current_user