7

我有 3 个角色:超级用户、超级用户和用户。我有表“数据”和函数 data_select 和 data_insert。

现在我想定义,只有超级用户才能访问表“数据”。Poweruser 和 user 不能直接访问表“数据”,只能通过函数访问。

用户只能运行函数 data_select,poweruser 可以运行 data_select 和 data_insert。

这样我就可以创建用户 alice, bob, ... 并继承他们的 user 或 poweruser 权限。

这真的可以实现吗?我与这个斗争了第二天,却一无所获。

感谢您的时间。

4

1 回答 1

8

是的,这是可行的。

superuser默认情况下,“超级用户”可以是实际postgres的。我将普通用户的角色重命名为usr,因为user是保留字 - 不要将其用作标识符。

CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser;  -- poweruser can do everything usr can.

CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;

CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;

REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;

REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;

CREATE FUNCTION
  ...
SECURITY DEFINER;

REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;

或者,您可以创建无需登录的守护程序角色来拥有这些功能并在表上拥有相应的权限。那会更加安全。

如果你走这条路,你会喜欢 ALTER DEFAULT PRIVILEGES的(在 PostgreSQL 9.0 中引入)。此相关答案中的更多详细信息

阅读手册中的安全地编写SECURITY DEFINER函数一章。

于 2012-02-12T11:40:11.920 回答