允许用户仅修改具有行级安全性的 PostgreSQL 表中的某些(但不是全部)字段

Obv*_*uit 7 postgresql row-level-security

我有一个 Postgres 表,如下所示:

用户身份 电子邮件地址 角色
68f00c4c-5dff-4886-a584-d44a23e47160 大卫 大卫@example.com 行政人员
3ed36117-e632-4b8b-b672-0b29f5f8b5c9 马丁 休斯 martin@example.com 顾客

我想写一份政策:

  • 允许客户在自己的记录中更新first_name,last_name和,但显然不是他们的或(因为这将授予客户管理权限)email_addressuser_idrole
  • 允许管理员编辑除user_id所有记录之外的所有字段(包括更改其他用户的角色)。

我是 Postgres 的新手,我正在尝试掌握编写行级安全策略的技巧。我很难在 SQL 中阐明更复杂的策略,因此如果有人能为我的应用程序中的场景提供示例,我将不胜感激。

我正在使用 Supabase,它有一个auth.uid()函数(示例),其中包含 JSON Web 令牌中的用户 ID。

小智 5

我也遇到了类似的问题,也是使用 Supabase。我最终创建了一个包含用户表可编辑列的视图,其中该视图执行行级过滤:

CREATE OR REPLACE VIEW editable_user AS
  SELECT u.name
  FROM pub_users u
  WHERE auth.uid() = u.id;
Run Code Online (Sandbox Code Playgroud)

就我而言,我只希望我的用户能够编辑自己的姓名,但这应该可以直接扩展到更多列。

然后在我的前端中,我直接写入这个视图(在今天之前我什至不知道这是可能的......)


Phi*_* W. -1

为什么允许用户(甚至管理员)靠近数据库本身?

您应该提供一个允许他们操作数据的应用程序,并且该应用程序不应该为他们提供任何方式来查看他们不应该看到的内容或更改他们不应该更改的内容。

如果有人获得了数据库本身的更新访问权限,那么一切都将失败。

  • 我使用 Supabase 作为我的 React 应用程序的后端([参见此处](https://supabase.io/docs/guides/auth#policies) 和[也在这里](https://supabase.io/docs/ learn/auth-deep-dive/auth-row-level-security)了解有关如何在此上下文中使用策略的更多信息)。 (2认同)