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.
我的应用程序有一个 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.