import { ReactNode } from 'react' import { Navigate } from 'react-router-dom' import { usePermission } from '../permission' import PermissionDenied from './PermissionDenied' import type { UserVersion } from '../permission' /** * 路由守卫组件 * * @description * 保护需要特定权限的路由,防止用户通过URL直接访问无权限页面 * 这是权限控制的"第二道防线"(第一道是TopNavigation的过滤) * * @version Week 2 Day 7 - 任务17 * * @example * ```tsx * * * * } * /> * ``` * * 工作原理: * 1. 用户访问 /literature 路由 * 2. RouteGuard 检查用户权限 * 3. 如果有权限 → 渲染子组件 * 4. 如果无权限 → 显示 PermissionDenied 页面 * 5. 如果未登录 → 重定向到登录页(后续实现) */ interface RouteGuardProps { /** 子组件 */ children: ReactNode /** 所需权限等级 */ requiredVersion?: UserVersion /** 模块名称(用于显示友好提示) */ moduleName?: string /** 是否重定向到首页(默认显示无权限页面) */ redirectToHome?: boolean } const RouteGuard = ({ children, requiredVersion, moduleName, redirectToHome = false, }: RouteGuardProps) => { const { user, isAuthenticated, checkModulePermission } = usePermission() // 1. 检查是否登录(后续实现真实认证) if (!isAuthenticated) { // TODO: 后续实现真实的登录流程 // 当前阶段:用户默认已登录(MOCK_USER) console.warn('用户未登录,应该重定向到登录页') // return } // 2. 检查权限等级 const hasPermission = checkModulePermission(requiredVersion) if (!hasPermission) { // 记录无权限访问尝试(用于后续分析和转化优化) console.log('🔒 权限不足:', { module: moduleName, requiredVersion, currentVersion: user?.version, userId: user?.id, timestamp: new Date().toISOString(), }) // 如果配置了重定向,直接返回首页 if (redirectToHome) { return } // 显示无权限页面(推荐,引导用户升级) return ( ) } // 3. 有权限,渲染子组件 return <>{children} } export default RouteGuard /** * 🛡️ 路由守卫最佳实践: * * 1. 双重防护策略: * - 第一道防线:TopNavigation(用户看不到无权限模块) * - 第二道防线:RouteGuard(防止URL直接访问) * - 为什么需要两道?防止用户通过浏览器直接输入URL绕过导航 * * 2. 权限检查时机: * ✅ 路由渲染前检查(RouteGuard) * ✅ API请求前检查(后端) * ✅ 组件渲染前检查(usePermission) * * 3. 无权限时的处理策略: * 【推荐】显示PermissionDenied页面 * - 优点:引导用户升级,商业转化机会 * - 缺点:需要额外页面 * 【备选】重定向到首页 * - 优点:简单直接 * - 缺点:用户体验不好,不利于转化 * * 4. 后续演进计划: * 【Week 2 Day 8-9】对接后端JWT认证 * - 实现真实的登录流程 * - 从token解析用户权限 * - 处理token过期 * * 【Week 3-4】ASL模块测试 * - ASL需要advanced权限 * - 测试权限控制是否生效 * - 优化无权限页面的转化率 * * 【Week 5+】完善权限系统 * - 动态权限配置 * - 功能级权限控制(不仅是模块级) * - 权限变更实时生效 * * 5. 安全注意事项: * ⚠️ 前端权限检查不是安全保障,仅用于用户体验 * ✅ 后端必须进行权限验证(真正的安全防线) * ✅ 敏感数据不应该发送到前端 * ✅ API调用必须携带认证token */