【发布时间】:2017-04-26 17:55:55
【问题描述】:
我正在 Ruby on Rails 中构建 JSON API。我希望拥有应该向系统提供数据但不应被允许从中读取数据的只写用户帐户。
为了获得额外的安全层,我想在数据库级别强制执行此规则。
这个想法是有一个“作家”类型的用户,它使用与数据库的单独连接。应该允许此连接插入/更新/删除,但不允许选择。
我已经把所有东西都设置好了,但不幸的是 Rails 在插入时会生成这个查询:
INSERT INTO "default"."products" ("id", "name", "sku") VALUES ($1, $2, $3) RETURNING "id"
“返回 id”部分使其失败,因为用户没有 SELECT 权限:
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR: permission denied
for relation products:
INSERT INTO "default"."products" ("id", "name", "sku") VALUES ($1, $2, $3) RETURNING "id"
有没有办法在 PG 或 Rails 中解决这个问题?我看到的两个选项是:
- 向 PG 中的写入用户授予“有限”SELECT 权限,因此他们只能“看到”某些列。我不知道这是否可能。
- 让 Rails 不在查询末尾添加“返回 id”,尽管这可能会产生副作用。
我发现了一篇有同样问题的人的文章,最后只是将 SELECT 权限授予作家用户:
https://til.hashrocket.com/posts/0c83645c03-postgres-permissions-to-insert-but-not-return
是否有实际的解决方案可以使上述设置正常工作?
【问题讨论】:
标签: ruby-on-rails postgresql select permissions sql-grant