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

如何用PostgreSQL行级安全创建“任意已登录用户”策略

排查PostgreSQL行级安全INSERT策略权限问题

以下是针对你遇到的权限拒绝问题的排查步骤:

  • 确认表已启用行级安全(RLS)
    行级安全策略只有在表开启RLS后才会生效,执行以下命令检查当前状态:

    SELECT relrowsecurity FROM pg_class WHERE relname = 'resources';
    

    如果返回f,需要启用RLS:

    ALTER TABLE public.resources ENABLE ROW LEVEL SECURITY;
    
  • 确保public_user角色拥有表的INSERT基础权限
    RLS策略是在用户已有表级权限的基础上生效的,必须先给角色授权:

    GRANT INSERT ON public.resources TO public_user;
    

    检查权限是否生效:

    SELECT has_table_privilege('public_user', 'public.resources', 'INSERT');
    

    返回t表示权限已正确授予。

  • 验证JWT会话变量是否正确设置
    你的策略依赖jwt.claims.person_id非空,执行INSERT前先确认该变量的值:

    SELECT NULLIF(CURRENT_SETTING('jwt.claims.person_id', true), '');
    

    如果返回NULL,说明JWT认证未正确将person_id写入会话变量,需要排查认证环节的配置。

  • 确认执行INSERT的用户属于public_user角色
    策略仅对public_user角色生效,检查当前用户是否符合:

    SELECT current_user;
    -- 或者检查用户是否继承了public_user角色
    SELECT EXISTS (
        SELECT 1 FROM pg_auth_members 
        WHERE roleid = (SELECT oid FROM pg_roles WHERE rolname = 'public_user')
          AND member = (SELECT oid FROM pg_roles WHERE rolname = current_user)
    );
    

    如果当前用户不属于该角色,策略不会应用到其操作上。

内容的提问来源于stack exchange,提问作者machineghost

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:50:28