名称: rls-patterns 描述: 用于数据库操作的行级安全模式。在编写 Prisma/数据库代码、创建访问数据的 API 路由或实现 Webhook 时使用。强制执行 withUserContext、withAdminContext 或 withSystemContext 辅助函数。切勿使用直接的 Prisma 调用。
RLS 模式技能
目的
为所有数据库操作强制执行行级安全(RLS)模式。确保数据隔离并防止跨用户数据访问。
适用场景
- 编写任何 Prisma 数据库查询
- 创建或修改访问数据库的 API 路由
- 实现 Webhook 处理程序
- 处理用户数据、支付、订阅
关键规则
切勿这样做
// ❌ 禁止 - 直接 Prisma 调用绕过 RLS
const user = await prisma.user.findUnique({ where: { user_id } });
总是这样做
import { withUserContext, withAdminContext, withSystemContext } from "@/lib/rls-context";
// ✅ 正确 - 用户操作用户上下文
const user = await withUserContext(prisma, userId, async (client) => {
return client.user.findUnique({ where: { user_id: userId } });
});
// ✅ 正确 - Webhooks 用系统上下文
await withSystemContext(prisma, "webhook", async (client) => {
return client.webhook_events.create({ data: eventData });
});
上下文辅助函数参考
| 辅助函数 | 用于 |
|---|---|
withUserContext |
面向用户的操作(配置文件、支付、订阅) |
withAdminContext |
仅限管理员的操作(争议、Webhook 事件) |
withSystemContext |
Webhooks 和后台作业 |
常见模式
使用用户上下文的 API 路由
export async function GET() {
const { userId } = await requireAuth();
const payments = await withUserContext(prisma, userId, async (client) => {
return client.payments.findMany({
where: { user_id: userId },
orderBy: { created_at: "desc" },
});
});
return NextResponse.json(payments);
}
管理员页面:强制动态
// 对于具有 RLS 的管理员页面,这是必需的
export const dynamic = "force-dynamic";
参考
- 实施指南:
docs/database/RLS_IMPLEMENTATION_GUIDE.md - 策略目录:
docs/database/RLS_POLICY_CATALOG.md