我的应用程序有一个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上设置只读用户?
谢谢!
答案 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),并且不一定授予某人对数据库的完全访问权限,而只是您希望他们看到的内容即可。适合某些人的特定需求/场景。