postgresql 9.1 - 通过函数访问表

Pet*_*zar 7 postgresql privileges grant

我有3个角色:超级用户,poweruser和用户.我有表"data"和函数data_select和data_insert.

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

用户只能运行data_select函数,poweruser可以同时运行data_select和data_insert.

那么我就可以创建用户alice,bob,...并继承用户或poweuser的权限.

这实际上是否可以实现?我在第二天与这个战斗,没有到达任何地方.

感谢您的时间.

Erw*_*ter 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;
Run Code Online (Sandbox Code Playgroud)

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

如果你要走这条路,你会喜欢 ALTER DEFAULT PRIVILEGES(PostgreSQL 9.0引入).这个相关答案的更多细节.

请阅读手册中的" 安全编写SECURITY DEFINER函数 "一章.