必须用docs/permission-model.md明确定义rbac模型,再通过cursor生成authcontext、受保护路由、按钮级权限及一致性校验代码,确保三层权限拦截精准可扩展。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

用Cursor开发React项目时,直接在代码里硬写权限判断容易漏掉边界情况,改起来也费劲;靠AI生成权限逻辑又怕它瞎编——比如把admin和user的路由守卫写反,或者漏掉按钮级权限校验。必须让Cursor既理解你的RBAC结构,又能精准输出可运行、带守卫、可扩展的权限控制代码。
第一步:给Cursor喂清楚权限模型
打开Cursor编辑器,在当前项目根目录新建一个docs/permission-model.md文件,用自然语言写清三件事:
① 角色定义:ADMIN能访问所有页面+操作全部按钮;USER只能看/home、/user,且仅能点击“编辑资料”按钮;GUEST只允许访问/login和/public。
② 路由层级:/admin/system是最高权限路径,/user/profile属于用户私有路径,/public/help是公开路径。
③ 权限粒度要求:必须同时支持路由守卫、菜单动态渲染、按钮显隐控制三层拦截——不能只做其中一层。
【关键前提】这个文档必须存在且路径固定,否则Cursor无法关联上下文生成一致逻辑。删掉或改名会导致后续生成的组件权限判断条件错乱。
第二步:让AI生成带Context的权限状态管理
选中刚写的docs/permission-model.md全文 → 右键 → “Ask Cursor” → 输入:“基于这个权限模型,生成一个React Context,管理当前用户角色、权限列表、登录状态,并提供useAuth hook。要求useAuth返回{ userRole, permissions, isLoggedIn, login, logout }。”
这一步生成的Context会自动包含token刷新逻辑和sessionStorage同步机制,比手写更健壮。生成后检查src/contexts/AuthContext.tsx里是否包含useEffect(() => { loadFromStorage() }, [])——没有就手动补上,否则页面刷新后权限状态丢失。
生成的hook默认导出名为useAuth,直接在组件里调用即可,不用再额外封装。
第三步:批量生成受保护路由组件
在终端输入:cursor generate --template protected-route --role ADMIN --path /admin/system
Cursor会自动创建src/routes/AdminSystemRoute.tsx,内含完整守卫逻辑:检查role === 'ADMIN'、验证token有效性、加载前显示骨架屏。若返回403则跳转到/unauthorized页面。
重复执行该命令,替换--role和--path参数,生成USER和GUEST对应的所有受保护路由。注意:不要用--role GUEST生成/login路由——它本身就不该被守卫,否则登录页进不去。
第四步:用自然语言驱动按钮权限生成
打开src/pages/UserProfilePage.tsx,在编辑器里高亮“保存修改”按钮所在行 → 右键 → “Ask Cursor” → 输入:“把这个按钮改成权限控制版本:只有user角色且permissions包含‘edit_profile’时才显示并启用,否则隐藏。”
Cursor会直接替换原按钮为:{hasPermission('edit_profile') && <button disabled>保存修改</button>},并自动注入const { hasPermission } = useAuth()。
方法一:对单个按钮精准干预,适合已有页面快速改造。
方法二:在新页面脚手架阶段就声明需求——比如输入“生成用户管理页,包含搜索框(全员可见)、新增按钮(仅ADMIN)、导出按钮(ADMIN和USER)”,Cursor会一次性生成带三重权限判断的完整组件。
第五步:强制AI校验权限逻辑一致性
选中整个src/contexts/AuthContext.tsx和所有src/routes/*.tsx文件 → 右键 → “Ask Cursor” → 输入:“检查这些文件里的权限判断是否全部基于userRole字段,是否存在直接用字符串字面量比较role的地方(如role === 'admin'),若有,请统一替换成useAuth().userRole。”
这一步会扫描出所有硬编码角色判断,比如某处写了if (role === 'admin')而其他地方用userRole === 'ADMIN'——大小写不一致会导致守卫失效。Cursor会直接给出替换建议,接受后立即修复。











