current_setting
是 PostgreSQL 原生就有的系统函数,用来读当前会话的 GUC (Grand Unified Configuration) 参数。它的签名大致是:
current_setting(setting_name text, missing_ok boolean DEFAULT false) RETURNS text
setting_name
:要读取的参数名,比如常见的 search_path
、TimeZone
,也可以是 Supabase 或其他应用通过 SET
注入进来的自定义参数,如 request.jwt.claims.sub
。missing_ok
:如果设为 true
且该参数不存在,则返回 NULL
而不是报错。Supabase 利用这一点,在每次数据库连接上执行类似:
SET request.jwt.claims.sub = '<JWT 中的 sub 值>';
然后你在 RLS 里就可以这样写:
-- 读 sub Claim
(current_setting('request.jwt.claims.sub', true))::uuid
-- 或读自定义 Claim
(current_setting('jwt.claims.user_id', true))::uuid