【问题标题】:Cannot query except when user set superuser除非用户设置超级用户,否则无法查询
【发布时间】:2015-10-05 05:56:05
【问题描述】:

我正在使用 PHP 来查询 PostgreSQL 数据库(PHP5、PostgreSQL 9.3.9)。我有一个拥有所有者的现有数据库。我正在尝试使辅助用户对 PHP 使用的数据库具有完全访问权限。当此用户设置为 SUPERUSER 时,它可以查询数据库。否则他不能。我将所有权限授予具有 postgres 超级用户的用户,用于相关数据库:

GRANT ALL PRIVILEGES ON DATABASE mydatabase TO phpuser;

当我查看数据库列表时,phpuser=CTc 列在 Access Privileges 上。该用户还设置了密码。

我错过了什么?我希望这个用户通过 PHP 以完全权限访问数据库。

【问题讨论】:

标签: php postgresql


【解决方案1】:

您不仅应该授予数据库权限(CTc 表示用户可以连接到数据库并创建新数据库和临时数据库),还应该授予数据库对象权限。

授予角色

最简单的方法是将所有者角色授予phpuser 角色:

GRANT owner_role TO phpuser;

但是,这可能会带来各种安全问题,并且通常不建议在任何情况下使用,除非您对自己的网络安全非常有信心。

授予权限

现在是艰难的道路。

首先,您的phpuser 很可能不必创建新的或临时数据库,因此请撤销这些权限:

REVOKE CREATE, TEMP ON DATABASE mydatabase FROM phpuser;

如果您在 public 以外的架构中有表或其他对象,请授予对这些架构的访问权限(发出这些命令时,您需要连接到数据库 mydatabase):

GRANT USAGE ON SCHEMA myschema TO phpuser;

现在您可以为架构内的所有表、序列、函数等授予权限,因此对于每个架构,包括public,请执行以下操作:

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA myschema TO phpuser;
GRANT ALL ON ALL SEQUENCES IN SCHEMA myschema TO phpuser;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA myschema TO phpuser;

如果您有一些更奇特的对象,请使用the appropriate command。视图包含在表授权中,索引自动包含在表中。

网络访问

请注意,phpuser 角色也应该在pg_hba.conf 文件中被允许访问。应该有这样一行(修改以匹配您的网络配置):

host mydatabase phpuser 127.0.0.1/32 md5

【讨论】:

  • 一点澄清:我应该只使用 GRANT CONNECT,而不是使用 GRANT ALL PRIVILEGES?
  • 是的,GRANT CONNECT ON DATABASE mydatabase TO phpuser 足以访问数据库对象。但是由于您已经授予了数据库的所有权限,您可以撤销那些不需要的权限。授予使应用程序正常运行所需的尽可能少的权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2022-11-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多