Heroku Postgres 数据库的只读权限

Read-only access for Heroku Postgres Databases

我的应用程序有一个 Heroku Postgres 数据库。我可以使用 Heroku

提供的 DATABASE_URL 轻松访问 psql shell
psql $(heroku config:get DATABASE_URL -a my_app)
psql (9.6.1)
SSL connection (protocol: TLSv1.2, cipher: ECDSE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

d5i032ahpfiv07=> 

并且默认情况下,该用户似乎具有更新和删除表的完全访问权限

d5i032ahpfiv07=> SELECT 
  table_name, 
  string_agg(privilege_type, ', ') as privileges
FROM information_schema.role_table_grants 
WHERE table_schema = 'public'
  AND grantee = current_user
GROUP BY 1
;

            table_name             |                          privileges
-----------------------------------+---------------------------------------------------------------
 articles                          | INSERT, TRIGGER, REFERENCES, TRUNCATE, DELETE, UPDATE, SELECT
 comment_flags                     | TRIGGER, INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES
 comment_likes                     | TRUNCATE, REFERENCES, TRIGGER, INSERT, SELECT, UPDATE, DELETE
 comments                          | INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER
 communities                       | TRIGGER, REFERENCES, TRUNCATE, DELETE, UPDATE, SELECT, INSERT
 .....

我很想在数据库中设置 "Read Only" 用户,这样人们就可以查看这些数据而不必担心 运行 "DROP TABLE" 或其他一些破坏性命令。

如何在 Heroku Postgres 上设置只读用户?

谢谢!

创建 Heroku Postgres Follower Database

A database follower is a read-only copy of the leader database that stays up-to-date with the leader database data. As writes and other data modifications are committed in the leader database, the changes are streamed, in real-time, to the follower databases.

然后简单地 运行 您的分析、数据剪辑和其他针对关注者的只读应用程序。这是一个非常标准的配置,可以保护您的主数据库,并增加了性能优势:您可以在不影响面向用户的应用程序的情况下使用查询(通常是密集型的并且具有不同的缓存配置文件)对其进行打击。

Adam 关于创建关注者数据库的建议通常是正确的解决方案,但也可以为任何 Heroku Postgres 数据库创建只读角色(或您想要的任何其他权限),即使是'没有追随者。

Heroku 在 Heroku Postgres Credentials 上有这方面的详细文档,但简要说明:

创建 Heroku 凭证

heroku pg:credentials:create <addon_name> --name new_credential -a <app_name>

<addon_name> 是您的 Postgres 插件的名称,您可以通过 运行ning heroku pg:info -a <app_name> 并检查输出中的 "Add-on" 行来找到它。

新凭证在上面的命令中被命名为new_credential,但您可以使用任何您想要的名称。

设置权限

创建 new_credential 凭证还会在您的 Postgres 数据库中创建一个 new_credential 角色 (see Postgres roles documentation)。您可以使用 psql 像任何其他角色一样设置 new_credential 的权限。默认情况下,角色没有权限。 Heroku 文档将此示例提供给 运行 in psql:

GRANT USAGE ON SCHEMA PUBLIC TO new_credential;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO new_credential;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT ON TABLES TO new_credential;

以上设置 new_credential 角色具有只读权限。有关详细信息,请参阅 Postgres documentation on privileges

附上凭证

在使用凭证之前,您需要将其附加到您的应用程序:

heroku addons:attach <addon_name> --credential new_credential -a <app_name>

当您 运行 addons:attach 命令时,输出将包含一个名为 HEROKU_POSTGRESQL_<COLOUR>_URL 的新配置变量,其中 <COLOUR> 是某种颜色。此配置变量包含一个 Postgres 连接 URL,您可以使用 new_credential 角色连接到数据库。

使用凭证

在应用程序中,使用上一步中创建的新配置变量连接到数据库,而不是默认的 DATABASE_URL(它仍然包含默认的读写凭据)。

你也可以在psql中使用新角色:

heroku pg:psql <addon_name> --credential new_credential -a <app_name>

或者,如果您想像示例中那样直接使用 psql,则可以使用新颜色 URL:

psql $(heroku config:get HEROKU_POSTGRESQL_<COLOUR>_URL -a <app_name>)

当您使用新角色连接到 Postgres 时,由于角色的权限,任何创建、更新或删除数据的尝试都将被 Postgres 拒绝。

这已经说过了,但对于那些不想获得真正技术知识的人来说,这是一个简单的解决方案。

https://data.heroku.com/dataclips

您可以在此处为您拥有的每个或任何单个 Heroku 应用创建数据剪辑。你 运行 任何你喜欢的查询,然后你可以通过 URL、CSV、JSON、Google Sheet、 或者您甚至可以添加个人或团队以访问它们。

这很好,因为您可以使用 Heroku 网络 UI(而不是通过 CLI),而且它并不一定会给某人完全访问数据库的权限,只是您希望他们看到的内容;适合某些人的特定needs/scenarios.