use*_*003 2 sql postgresql heroku readonly
我的应用程序有一个Heroku Postgres数据库.我可以psql使用DATABASE_URLHeroku 提供的方便地访问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=>
Run Code Online (Sandbox Code Playgroud)
默认情况下,此用户似乎可以完全访问更新和删除表
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
.....
Run Code Online (Sandbox Code Playgroud)
我很乐意在数据库中设置"只读"用户,以便人们可以查看此数据,而无需担心运行"DROP TABLE"或其他破坏性命令.
如何在Heroku Postgres上设置只读用户?
谢谢!
创建一个Heroku Postgres Follower数据库
数据库关注者是领导者数据库的只读副本,该数据库与领导者数据库数据保持同步.随着在领导者数据库中提交写入和其他数据修改,更改将实时流式传输到跟随者数据库.
然后,只需针对关注者运行您的分析,dataclips和其他只读应用程序.这是一个非常标准的配置,可以保护您的主数据库,并增加了性能优势:您可以使用查询(通常是密集型并具有不同的缓存配置文件)来处理它,而不会影响面向用户的应用程序.
Adam 建议创建一个关注者数据库通常是解决此问题的正确解决方案,但是可以为任何 Heroku Postgres 数据库创建只读角色(或您想要的任何其他权限),即使是不是关注者的数据库。
Heroku 在Heroku Postgres Credentials 中有详细的文档,但简要说明:
创建 Heroku 凭证
heroku pg:credentials:create <addon_name> --name new_credential -a <app_name>
Run Code Online (Sandbox Code Playgroud)
<addon_name>是您的 Postgres 插件的名称,您可以通过运行heroku pg:info -a <app_name>并检查输出中的“插件”行来找到该名称。
新凭据new_credential在上述命令中命名,但您可以使用任何您想要的名称。
设置权限
创建new_credential凭证还会在您的 Postgres 数据库中创建一个new_credential 角色(请参阅 Postgres 角色文档)。您可以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;
Run Code Online (Sandbox Code Playgroud)
以上设置new_credential角色具有只读权限。有关更多详细信息,请参阅有关权限的Postgres 文档。
附上凭证
在您可以使用凭证之前,您需要将其附加到您的应用程序:
heroku addons:attach <addon_name> --credential new_credential -a <app_name>
Run Code Online (Sandbox Code Playgroud)
当您运行该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>
Run Code Online (Sandbox Code Playgroud)
或者,如果您想像示例中一样直接使用 psql,则可以使用新的颜色 URL:
psql $(heroku config:get HEROKU_POSTGRESQL_<COLOUR>_URL -a <app_name>)
Run Code Online (Sandbox Code Playgroud)
当您使用新角色连接到 Postgres 时,由于角色的权限,任何创建、更新或删除数据的尝试都将被 Postgres 拒绝。
| 归档时间: |
|
| 查看次数: |
1610 次 |
| 最近记录: |