使用登录名(用户)创建PostgreSQL 9角色以执行函数

使用登录名(用户)创建PostgreSQL 9角色以执行函数,postgresql,Postgresql,我一直在寻找这几年,我已经尝试了一切在网上没有成功 我可以在MSSQL中实现这一点,但我没有找到在PostgreSQL中实现这一点的方法 我想要实现的是创建一个登录名为的角色,它不能创建、删除或更改数据库、函数、表或其他任何内容。只需选择特定的功能 例如,如果我有一个名为customer的表和两个名为return\u customers()和return\u time()的函数,我只想要一个登录名为return\u customers()和select return\u time()的角色。仅此

我一直在寻找这几年,我已经尝试了一切在网上没有成功

我可以在MSSQL中实现这一点,但我没有找到在PostgreSQL中实现这一点的方法

我想要实现的是创建一个登录名为的角色,它不能创建、删除或更改数据库、函数、表或其他任何内容。只需选择特定的功能

例如,如果我有一个名为customer的表和两个名为
return\u customers()
return\u time()
的函数,我只想要一个登录名为
return\u customers()
select return\u time()
的角色。仅此而已


非常感谢您支持这个有用的网站

在连接到要配置的数据库时执行此操作

-- Create the user.
CREATE ROLE somebody WITH LOGIN PASSWORD '...';

-- Prevent all authenticated users from being able to use the database,
-- unless they have been explicitly granted permission.
REVOKE ALL PRIVILEGES ON DATABASE foo FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM PUBLIC;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM PUBLIC;

-- Allow the user to only use the specified functions.
GRANT CONNECT ON DATABASE foo TO somebody;
GRANT EXECUTE ON FUNCTION return_customers(), return_time() TO somebody;
如果您的模式多于“public”,则需要将这些模式添加到两个
REVOKE ALL PRIVILEGES ON ALL…
语句中

不要忘记,函数必须已经执行,否则此用户仍将无法执行它们,因为函数的内容将使用此用户(而不是创建函数的用户)的权限执行

见:

  • 尤其是
    安全定义者
  • 用于将用户添加到角色,以及为表、序列等分配访问权限

@Ignacio请注意,在撤销了
public
的权限后,您必须
向其他用户授予
权限,以便他们仍然可以访问表/函数/等。我强烈建议创建一个或多个角色,并让用户成为这些角色的成员,而不是
直接向用户授予
权限。您不必
授予对象所有者
,但实际上,您的应用程序无论如何都不应该以数据库/表所有者的身份进行日常操作。亲爱的cdhowie和Craig Ringer,非常感谢您的回答!我真的很感激他们!我一直在与Postgre讨论这个话题,我注意到一些事情,如果我错了,请你纠正我。1-不建议在数据库名称中使用大写字母,因为撤销所有特权会引发错误。2-如果我们创建另一个数据库,我们必须撤销对受限用户的所有权限,或者创建对象并撤销对公共的所有权限。非常感谢你,伊格纳西奥。请让我回答最后两个问题。1-是否有一种方法不允许受限用户查看表和函数的定义?2-正如我们在官方文档中看到的,它建议设置search_path=admin,pg_temp;因此,在最后一个位置搜索pg_temp模式,以便用户无法屏蔽对象。在我们的例子中,我们必须将其设置为:set search\u path=public,pg\u temp?我希望这篇文章对其他希望提高PostgreSQL数据库安全性的开发人员有用。再次非常感谢!