[ PROMPT_NODE_25146 ]
security-rls-basics
[ SKILL_DOCUMENTATION ]
## 为多租户数据启用行级安全性 (RLS)
行级安全性 (RLS) 在数据库层面强制执行数据访问,确保用户只能看到自己的数据。
**错误(仅在应用层过滤):**
sql
-- 仅依赖应用程序进行过滤
select * from orders where user_id = $current_user_id;
-- 漏洞或绕过意味着所有数据都会暴露!
select * from orders; -- 返回所有订单
**正确(数据库强制执行的 RLS):**
sql
-- 在表上启用 RLS
alter table orders enable row level security;
-- 创建策略,使用户只能看到自己的订单
create policy orders_user_policy on orders
for all
using (user_id = current_setting('app.current_user_id')::bigint);
-- 即使对于表所有者也强制执行 RLS
alter table orders force row level security;
-- 设置用户上下文并查询
set app.current_user_id = '123';
select * from orders; -- 仅返回用户 123 的订单
针对已认证角色的策略:
sql
create policy orders_user_policy on orders
for all
to authenticated
using (user_id = auth.uid());
参考:[行级安全性](https://supabase.com/docs/guides/database/postgres/row-level-security)