You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL/Supabase中针对特定列限制RLS权限

解决Supabase中已认证用户仅能修改指定列的RLS策略问题

你可以通过PostgreSQL内置函数结合RLS的WITH CHECK子句实现精准的列级修改限制,无需复杂额外配置,以下是两种常用方案:

方案1:限制仅允许修改指定列

利用PostgreSQL的updated_columns()函数,它会返回本次UPDATE操作中实际被修改的列名数组。通过判断这个数组是否仅包含is_finished,就能严格限制用户的修改范围:

CREATE POLICY "已认证用户仅可更新is_finished列" ON games
FOR UPDATE TO authenticated
USING (true)
WITH CHECK (
  updated_columns() = '{is_finished}'::text[]
);
  • TO authenticated:明确策略仅对已认证用户生效
  • WITH CHECK中的条件确保用户只能修改is_finished列,任何尝试修改points或其他列的操作都会被RLS直接拦截

如果后续需要开放更多可修改列,只需扩展数组即可,比如:updated_columns() <@ '{is_finished, status}'::text[](表示修改的列只能是数组中的子集)

方案2:禁止修改指定列

另一种思路是确保points列的值在更新前后保持一致,这样即使用户尝试修改points,也会因为新旧值未发生变化而被系统判定为无效操作(实际等同于无法修改):

CREATE POLICY "已认证用户不可修改points列" ON games
FOR UPDATE TO authenticated
USING (true)
WITH CHECK (
  points = OLD.points
);

这种方式更适合需要保护特定列、允许修改其他所有列的场景,无需逐个指定可修改列。

注意事项

  1. 确保目标表已启用RLS:ALTER TABLE games ENABLE ROW LEVEL SECURITY;
  2. 你的现有策略已经限制了未认证用户访问,无需额外调整这部分逻辑

内容的提问来源于stack exchange,提问作者Jan D.M.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:57:39