Next.js 15 + Supabase 的 Cursor 规则:先堵住这几条 AI 幻觉

awesome-cursorrules 里那份 Next.js 15 + Supabase 规则,专治 getSession、同步 params、废弃 auth-helpers、缺 RLS。本文按原文拆可核对禁令,并说明怎么塞进 .cursor/rules。

Next.js 15 + Supabase Cursor 规则:堵住 getSession 与同步 params 等幻觉

用 Cursor Agent 写 Next.js 15 + Supabase,最烦人的不是「语法不对」,而是它一本正经写出能编译、上线会出事的代码:服务端用 getSession()、页面里同步读 params、还在从 @supabase/auth-helpers-nextjs 引客户端。社区仓库 awesome-cursorrules 里有一份专门怼这类幻觉的规则:nextjs15-supabase-cursorrules-prompt-file.mdc,简介写着约 27 条架构约束。

装法总览见 awesome-cursorrules 怎么用。下面只拆这份规则里最值得先抄进项目的几条硬禁令。

先装进项目,再谈抄哪些

  1. 在仓库根建 .cursor/rules/
  2. 把上述 .mdc 拷进去(可改成短文件名,如 nextjs-supabase.mdc)。
  3. 按你仓库收紧 frontmatter 的 globs(例如 app/**/*.{ts,tsx}lib/**/*.ts),别长期 **/* 全开。
  4. 用 Agent 做一次「加一个需登录的页面」小任务,专门盯 auth 与 params 写法。

RULE 1:服务端别用 getSession()

规则原文定调是 SECURITY CRITICAL:getSession() 从 cookie 读 JWT 不做服务端校验,伪造 cookie 可能直接过。服务端鉴权应走 getUser(),让 Supabase 校验用户。

// 规则倡导的写法
const supabase = await createClient()
const { data: { user } } = await supabase.auth.getUser()
if (!user) redirect('/login')

// 规则明确禁止的写法
const { data: { session } } = await supabase.auth.getSession()

你在 Code Review 里看到服务组件 / Route Handler 里的 getSession(),就按这条打回,别跟 Agent 争「这样也能跑」。

RULE 2:Next.js 15 里 params 要 await

Next.js 15 起,页面/布局的 paramssearchParams 是 Promise。同步解构在类型上有时还能糊弄过去,运行时会炸。规则要求:

export default async function Page({
  params,
}: {
  params: Promise<{ id: string }>
}) {
  const { id } = await params
}

让 Agent 生成动态路由时,把「必须 await params」写进你的验收标准,比事后修 TypeError 省事。

RULE 3:别再引 auth-helpers-nextjs

规则写明 @supabase/auth-helpers-nextjs 已弃用,和 App Router 的 cookie 模型不对付。应使用 @supabase/ssrcreateServerClient,并自己处理 cookie。Agent 训练数据里旧教程很多,没有这条规则时它特别爱生成废弃包。

RULE 4–5:RLS 默认开,组件默认 Server

每张业务表启用 Row Level Security,并写清 policy;缺 RLS 时,拿着 anon key 的人可能读到整表。UI 侧默认 React Server Components,尽量少 'use client'——和同仓库另一份 Next.js 15 + React 19 规则的方向一致,但这份把 Supabase 安全写得更死。

抄规则时该裁掉什么

原文件还绑了 Stripe「只放服务端」、Zod、shadcn/ui 等栈假设。你没用 Stripe,就把支付相关段落删掉,避免 Agent 主动加支付依赖。你用的是其他 ORM / 自建 auth,这条规则的 Supabase 专段也不要硬套——只保留「async params」「禁废弃包」这类与栈无关的禁令即可。

Rules 是约束,不是让你放弃看 diff。装完后仍用小 PR 验收;总览工作流见 Rules / Skills / MCP。后端若是 FastAPI,可对照 FastAPI 规则怎么裁