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

用 Cursor Agent 写 Next.js 15 + Supabase,最烦人的不是「语法不对」,而是它一本正经写出能编译、上线会出事的代码:服务端用 getSession()、页面里同步读 params、还在从 @supabase/auth-helpers-nextjs 引客户端。社区仓库 awesome-cursorrules 里有一份专门怼这类幻觉的规则:nextjs15-supabase-cursorrules-prompt-file.mdc,简介写着约 27 条架构约束。
装法总览见 awesome-cursorrules 怎么用。下面只拆这份规则里最值得先抄进项目的几条硬禁令。
先装进项目,再谈抄哪些
- 在仓库根建
.cursor/rules/。 - 把上述
.mdc拷进去(可改成短文件名,如nextjs-supabase.mdc)。 - 按你仓库收紧 frontmatter 的
globs(例如app/**/*.{ts,tsx}、lib/**/*.ts),别长期**/*全开。 - 用 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 起,页面/布局的 params、searchParams 是 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/ssr 的 createServerClient,并自己处理 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 规则怎么裁。