postgresql - 自动允许用户访问 postgres 中的表

标签 postgresql permissions database-migration

我有一个用于 Web 应用程序的 Postgresql 数据库。数据库由系统上的特定用户拥有,比方说 foouser。作为所有者,此用户对数据库具有完全权限。

服务器还有另一个用户,比方说webappuser,它是运行应用程序服务器的用户。我不想在 Web 应用程序的配置文件中指定用户名和密码,而是想使用“对等”身份验证。我已经让身份验证正常工作,但我遇到了以下问题。

当我在 Postgresql 中创建 webappuser 角色时,我授予它 LOGIN 权限以及 GRANT ALL ON DATABASE foo TO webappuser; 和在数据库中 GRANT ALL ON SCHEMA public TO webappuser;

我遇到的问题是表权限。与默认情况下允许访问所有表的 MySQL 如果您可以访问数据库(我认为这是一个合理的假设)不同,Postgresql 拒绝访问所有表,即使已授予模式和数据库权限。为了解决这个问题,我必须明确授予对我使用 GRANT ALL ON TABLE table_name TO webappuser; 创建的所有新表、 View 、过程等的权限(对于 View 等也类似) .).

结果是,每当我运行数据库迁移时,我都必须为创建的新表添加数据库权限。问题是我无法将此权限信息添加到迁移本身,因为开发人员机器没有那个额外的用户。无论如何,这看起来确实是错误的做事方式。

每次创建表、 View 、过程等时,我如何允许这个额外用户访问数据库表而不需要手动干预?

奖励积分:有没有办法将用户的权限限制为仅 CRUD 操作而不是完全权限,并且仍然自动执行整个操作?

最佳答案

没有 Laravel 迁移细节的经验:当你在同一台服务器上进行迁移时应该没有问题,只要权限也被迁移,因为 webappuser 在集群范围内可用.

当迁移到不同的服务器时,您需要在该新服务器上创建用户并为所有迁移的对象设置权限。您基本上有两种方法可以做到这一点。

第一个是在迁移之前设置模式中表的默认权限,或者在迁移之后GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA sch_name TO webappuser。默认权限设置为:

ALTER DEFAULT PRIVILEGES IN SCHEMA sch_name
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO webappuser;

这两个命令都完全符合 SQL 标准,因此跨合规架构应该没有问题。

请记住,在同一架构中创建的任何其他表也将具有为 webappuser 设置的权限。由于潜在的权限泄漏,不建议在生产环境中以这种方式为“不受信任”的用户(使用 Web 应用程序的人)设置权限;在开发环境中,它可能是可以接受的。

第二个——我个人更喜欢——是编写一个存储过程来设置适当的权限。进行迁移,运行存储过程一次,您应该可以正常运行了。这使您可以更好地控制权限授予。该过程可能类似于:

CREATE FUNCTION grant_webapp_privileges() RETURNS void AS $$
  -- Create the webappuser, if necessary
  CREATE ROLE webappuser LOGIN;

  -- Grant privileges on all required objects
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE table1 TO webappuser;
  ...
$$ LANGUAGE SQL;

在 master 数据库上,您只需要在创建或删除新关系时使存储过程保持最新即可。如果 Laravel 支持插入不在您正在迁移的模式中的代码块,您可以将上述过程设为匿名代码块,在迁移后执行。

(顺便说一句,我从不给类似 webappuser 的角色 CRUD 访问权限。相反,我总是通过隐藏一些底层数据模型细节的 View 提供访问权限,例如 person 具有 addresscontact_information 和其他详细信息; View 将所有内容集中在一个大行中。这样您就可以轻松更改基础关系并更新 View ,而不必调整您的 Web 应用程序。与 OOP 的原理相同,并且更易于管理权限。)

关于postgresql - 自动允许用户访问 postgres 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645599/

相关文章:

class - 如何在UML类图中以最佳方式可视化“权限矩阵”?

security - 如何为我的 symfony2 网站实现权限角色/组系统

mysql - 将 MySQL 迁移到 DB2

postgresql - 多对多关系中所有 3 个表的 SELECT 语句

postgresql - PostGIS,可以从一些点创建多边形

postgresql - Mountain Lion Postgres 无法连接

amazon-web-services - 使用 AWS Amplify 更新 DynamoDB 架构

database - 锁定 postgresql 表

objective-c - 以用户身份运行的守护进程无人需要从桌面复制文件

php - Laravel 表 * 没有名为 * 的列