← ClaudeAtlas

fec-route-protectionlisted

用于实现或审查前端路由保护、auth guard、RBAC、权限路由、登录态处理、重定向、middleware、React Router、Next.js、Vue Router 或 Nuxt route middleware;中文触发词包括 路由保护、权限路由、登录态。
bovinphang/frontend-craft · ★ 15 · Web & Frontend · score 80
Install: claude install-skill bovinphang/frontend-craft
# 路由保护 ## 用途 为前端应用建立清晰的认证、授权和重定向边界,避免越权访问与闪烁渲染。 ## 适用场景 - 页面需要登录后访问,或不同角色看到不同路由。 - 需要实现 React Router、Next.js、Nuxt 或 Vue Router 的路由守卫。 - 登录过期、权限不足、组织/租户切换需要统一处理。 - 不用于替代服务端授权;前端路由保护只能改善体验,不能作为唯一安全边界。 ## 流程 ### 1. 定义认证与授权状态 ```ts export type AuthStatus = "loading" | "anonymous" | "authenticated"; export interface CurrentUser { id: string; roles: string[]; permissions: string[]; } export function canAccess(user: CurrentUser, required: string[]) { return required.every((permission) => user.permissions.includes(permission)); } ``` ### 2. React Router 使用布局守卫 ```tsx import { Navigate, Outlet, useLocation } from "react-router-dom"; interface ProtectedRouteProps { requiredPermissions?: string[]; } export function ProtectedRoute({ requiredPermissions = [] }: ProtectedRouteProps) { const location = useLocation(); const { status, user } = useAuth(); if (status === "loading") return <RouteLoading />; if (status === "anonymous") { return <Navigate to="/login" replace state={{ from: location }} />; } if (requiredPermissions.length > 0 && !canAccess(user, requiredPermissions)) { return <Navigate to="/403" replace />; } return <Outlet />; } ``` ```tsx const router = createBrowserRouter([ { element: <ProtectedRoute requiredPermissions={["orders:read"]} />, children: [{ path: "/orders", element: <OrdersPage /> }], }, ]); ``` ### 3. Next.js 优先在服务端边界处理 ```ts // middleware.ts import { NextResponse, type NextRequest } from "next/server