如何用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
相关产品推荐
相关产品推荐

