我有一个用于 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
具有 address
、contact_information
和其他详细信息; View 将所有内容集中在一个大行中。这样您就可以轻松更改基础关系并更新 View ,而不必调整您的 Web 应用程序。与 OOP 的原理相同,并且更易于管理权限。)
关于postgresql - 自动允许用户访问 postgres 中的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26645599/