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

Supabase Python客户端JWT认证搭配RLS失效问题求助

解决Supabase RLS更新失败:正确传递JWT到Python客户端

你的问题核心是Supabase客户端执行数据库请求时未携带用户JWT,导致RLS规则中的auth.uid()无法获取到当前用户ID,最终auth.uid() = user_id校验不通过,更新被拦截。以下是两种可行的解决方案:

方法1:全局绑定JWT到客户端

如果当前客户端仅处理单个用户的请求,可以在初始化客户端时直接绑定JWT,后续所有请求都会自动携带该身份信息:

from supabase import create_client, Client

# 替换为你的项目信息
SUPABASE_URL = "你的Supabase项目URL"
SUPABASE_ANON_KEY = "你的Supabase anon key"
user_jwt = "前端传入的用户JWT"

# 初始化客户端,关闭自动刷新和会话持久化(后端场景不需要)
supabase: Client = create_client(
    SUPABASE_URL,
    SUPABASE_ANON_KEY,
    options={"auth": {"auto_refresh_token": False, "persist_session": False}}
)

# 将JWT绑定到客户端会话
supabase.auth.set_session(user_jwt, "")  # refresh token留空即可

之后执行你的update代码,无需额外配置,RLS规则会正确识别auth.uid():

user = supabase.auth.get_user(user_jwt)
user_id = user.dict()["user"]["id"]

response = (
    supabase
    .table("users")
    .update({"credits": 10})
    .eq("user_id", user_id)
    .execute()
)

方法2:单个请求携带JWT

如果客户端需要处理多用户请求,或者不想全局绑定身份,可以在每次数据库请求中通过headers参数手动传递JWT:

user = supabase.auth.get_user(user_jwt)
user_id = user.dict()["user"]["id"]

response = (
    supabase
    .table("users")
    .update({"credits": 10})
    .eq("user_id", user_id)
    # 手动添加Authorization头
    .execute(headers={"Authorization": f"Bearer {user_jwt}"})
)

关键说明

你之前调用supabase.auth.get_user(jwt)仅用于解析用户ID,不会自动将JWT绑定到后续的数据库请求。Supabase的RLS规则依赖请求头中的JWT来识别用户,必须显式传递才能让auth.uid()返回正确的用户ID,匹配你的更新规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:32:22