Heroku Postgres数据库的只读访问权限

时间:2017-06-14 18:01:25

标签: sql postgresql heroku readonly

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

轻松访问DATABASE_URL 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
 .....

我很乐意在数据库中设置“只读”用户,以便人们可以查看此数据,而无需担心运行“DROP TABLE”或其他破坏性命令。

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

谢谢!

3 个答案:

答案 0 :(得分:7)

创建Heroku Postgres Follower Database

  

数据库关注者是领导者数据库的只读副本   与领导者数据库数据保持同步。作为写和其他   数据修改是在领导者数据库中提交的,即变更   实时流式传输到跟随者数据库。

然后,只需针对关注者运行您的分析,dataclips和其他只读应用程序。这是一个非常标准的配置,可以保护您的主数据库,并增加了性能优势:您可以使用查询(通常是密集的并具有不同的缓存配置文件)来处理它,而不会影响面向用户的应用程序。

答案 1 :(得分:1)

Adam建议创建一个跟随者数据库通常是解决此问题的正确方法,但是有可能为任何Heroku Postgres数据库创建一个只读角色(或所需的任何其他权限),即使不是追随者。

Heroku在Heroku Postgres Credentials上有详细的文档,但是简要介绍了

创建Heroku凭据

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

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

在上述命令中,新凭据的名称为new_credential,但是您可以使用任意名称。

设置权限

创建new_credential凭据还会在Postgres数据库中创建一个new_credential 角色see Postgres roles documentation)。您可以像使用其他角色一样为new_credential设置权限,方法是使用psql。默认情况下,该角色没有权限。 Heroku文档给出了此示例,可在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,您可以使用该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将拒绝任何创建,更新或删除数据的尝试。

答案 2 :(得分:0)

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

https://data.heroku.com/dataclips

您可以在此处为每个或任何单个Heroku应用创建数据剪辑。您可以运行所需的任何查询,然后可以通过 URL,CSV,JSON,Google表格进行共享,甚至可以添加个人或团队来访问它们。

这很不错,因为您可以使用Heroku Web UI(而不是通过CLI),并且不一定授予某人对数据库的完全访问权限,而只是您希望他们看到的内容即可。适合某些人的特定需求/场景。