行级安全(RLS)模式技能Skill rls-patterns

这个技能专注于实施行级安全(RLS)模式,确保数据库操作的数据隔离和安全,通过使用上下文辅助函数如 withUserContext,适用于开发安全的后端API、处理Webhook和用户数据管理。关键词:行级安全,RLS,数据库安全,数据隔离,Prisma,API路由,Webhook,后端开发。

后端开发 0 次安装 0 次浏览 更新于 3/15/2026

名称: 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