当前位置: 首页 > news >正文

react路由守卫、权限控制实现

React 本身没有像 Vue (beforeEach) 那样内置的路由守卫,一般都是通过React Router + 登录状态 + 权限控制 + 高阶组件(HOC) / 自定义组件 / Hook来实现。

React 企业项目(后台管理、ERP、OA、CMS)一般都会实现四层权限:

登录认证(Auth) ↓ 路由权限(Route Guard) ↓ 菜单权限(Menu Permission) ↓ 按钮权限(Button Permission)

下面按照企业项目的方式完整讲解。


一、React 路由守卫是什么?

作用:

用户访问页面之前,先判断有没有权限。

例如:

未登录 访问 /login √ /home × 跳到 login /user × /system ×

登录以后

admin /home √ /system √ /user √

普通用户

/home √ /system × /user √

所以路由守卫主要干三件事:

① 是否登录 ② 是否有角色权限 ③ 是否有页面权限

二、React Router v6 路由

例如:

import { BrowserRouter, Routes, Route } from "react-router-dom"; <BrowserRouter> <Routes> <Route path="/login" element={<Login />} /> <Route path="/" element={<Layout />}> <Route path="home" element={<Home />} /> <Route path="user" element={<User />} /> <Route path="system" element={<System />} /> </Route> </Routes> </BrowserRouter>

但是这里任何人都能访问。

需要加守卫。


三、第一层:登录守卫

创建

AuthRoute.tsx
import { Navigate } from "react-router-dom"; export default function AuthRoute({ children }) { const token = localStorage.getItem("token"); if (!token) { return <Navigate to="/login" replace />; } return children; }

然后包裹页面。

<Route path="/" element={ <AuthRoute> <Layout /> </AuthRoute> } />

流程:

访问 ↓ 有没有token ↓ 没有 ↓ Navigate("/login") ↓ 有 ↓ 继续访问

四、token 一般存哪里?

企业里一般:

登录 ↓ 接口返回 { token:"xxxxx" }

保存

localStorage.setItem("token", token);

退出登录

localStorage.removeItem("token");

或者

Redux

store.user.token

或者

Context

UserContext

五、第二层:角色权限

后台一般返回:

{ "username":"admin", "role":"admin" }

或者

{ "roles":[ "admin", "editor" ] }

定义路由:

const routes = [ { path:"/home", element:<Home/> }, { path:"/system", roles:["admin"], element:<System/> }, { path:"/user", roles:["admin","editor"], element:<User/> } ]

守卫:

const role = "editor"; if(route.roles){ if(!route.roles.includes(role)){ return <Navigate to="/403"/> } }

效果:

admin home √ system √ user √
editor home √ system × user √

六、第三层:菜单权限

后台返回:

[ "/home", "/user" ]

说明:

用户只能看到

首页 用户管理

菜单配置:

const menus = [ { path:"/home", title:"首页" }, { path:"/user", title:"用户" }, { path:"/system", title:"系统设置" } ]

过滤:

const permission = ["/home","/user"]; const menu = menus.filter(item=>{ return permission.includes(item.path); })

最终:

首页 用户管理

系统设置不会显示。


七、第四层:按钮权限

后台返回:

[ "user:add", "user:delete", "user:update" ]

页面:

<button>新增</button> <button>删除</button> <button>修改</button>

可以封装:

function Permission({ code, children }) { const buttons = [ "user:add", "user:update" ]; if(buttons.includes(code)){ return children; } return null; }

使用:

<Permission code="user:add"> <Button>新增</Button> </Permission> <Permission code="user:delete"> <Button>删除</Button> </Permission>

结果:

新增 √ 删除 ×

八、动态路由权限(企业最常见)

很多后台不会把所有路由写死。

登录后:

login ↓ token ↓ 获取用户信息 ↓ 获取权限 ↓ 后台返回路由 ↓ 动态生成React Router

例如后台返回:

[ { "path":"/home", "component":"Home" }, { "path":"/user", "component":"User" } ]

前端映射:

const componentMap = { Home: Home, User: User, System: System }; const routes = backendRoutes.map(item => ({ path: item.path, element: React.createElement(componentMap[item.component]) }));

这样后台控制:

哪些页面能访问

不用重新发版。


九、完整流程(企业项目)

用户访问 ↓ Route Guard ↓ 有没有token? ↓ 没有 ↓ login ↓ 登录 ↓ token ↓ 获取用户信息 ↓ 获取角色 ↓ 获取菜单权限 ↓ 获取按钮权限 ↓ 动态生成菜单 ↓ 动态生成路由 ↓ 进入首页

十、推荐项目目录结构

src │ ├── router │ ├── index.tsx // 路由入口 │ ├── routes.ts // 路由配置 │ ├── AuthRoute.tsx // 登录守卫 │ ├── PermissionRoute.tsx// 权限守卫 │ ├── layouts │ └── Layout.tsx │ ├── pages │ ├── Login │ ├── Home │ ├── User │ └── System │ ├── store │ └── user.ts // token、角色、权限 │ ├── hooks │ └── usePermission.ts // 权限 Hook │ ├── components │ └── Permission.tsx // 按钮权限组件 │ └── utils └── auth.ts // token 工具

十一、企业级最佳实践(React Router v6 + Redux)

对于使用React Router v6 + Redux(或 Zustand)的中大型项目,推荐采用以下职责划分:

模块职责数据来源
登录认证校验 Token 是否存在、是否过期localStorage+ Redux
路由守卫拦截未登录用户、校验页面访问权限Redux 中的用户信息和权限
菜单权限根据后端返回的菜单列表动态渲染侧边栏后端菜单接口
动态路由根据后端返回的路由配置生成可访问路由路由配置接口
按钮权限控制按钮、操作入口是否显示或禁用后端权限码(如user:add
权限 Hook封装权限判断逻辑(如usePermissionRedux/Zustand
Permission组件在 JSX 中优雅地控制权限显示权限 Hook

这种分层方式具有以下优点:

  • 职责清晰:认证、路由、菜单、按钮权限互不耦合。

  • 便于扩展:新增角色或权限类型时,只需调整权限配置和判断逻辑。

  • 符合企业后台实践:适用于 React + Ant Design、React + Material UI 等常见后台管理系统,也便于与 RBAC(基于角色的访问控制)模型结合。

  • 支持动态权限:能够结合后端返回的数据,实现菜单、路由和按钮权限的统一管理。

如果你正在准备前端面试,这套实现(登录认证 + 路由守卫 + 动态路由 + 菜单权限 + 按钮权限 + RBAC)基本覆盖了 React 中后台项目关于权限控制的高频考点。

http://www.gsyq.cn/news/1602802.html

相关文章:

  • TI评估板安全使用指南:从概念验证到产品设计的风险管控
  • 国产AI芯片大模型适配:FlagGems、o-group与FP4+FP8混合精度实战
  • WorkBuddy 最强 Skill 来了!智囊团三件套:GPT-5.5、Claude、DeepSeek、GLM 同时帮你干活
  • 2026年最新AI写作辅助网站全攻略(含新手入门指南)
  • Hot 100 --- 两两交换链表中的节点
  • 市场分析化技术波特五力模型与SWOT分析应用
  • PX4编译报错:子模块缺失的诊断与修复指南
  • 【共创季稿事节】鸿蒙 ArkTS 布局进阶:@Reusable 可复用组件 —— 列表滚动性能优化的终极武器
  • Python协程与异步编程实战
  • 免费畅玩Switch游戏的终极方案:Ryujinx模拟器完整指南
  • SVG学习笔记
  • 如何将Amlogic电视盒变身为功能完整的Linux服务器:2025年终极开源解决方案
  • Destiny 2单人模式完整指南:如何快速实现独狼游戏体验
  • 智能自动化OpenCore配置工具:OpCore-Simplify让黑苹果配置从3天缩短到15分钟
  • Untrunc视频修复工具:三步恢复损坏MP4文件的终极指南
  • 系统扩展性设计
  • 学术论文写作三部曲:从精准文题到高效检索(文题、摘要、关键词)
  • codex 借助ccswitch 使用qwen/deepseek/glm5.2
  • 为什么你的角色扮演总“OOC”?ChatGPT提示词中被忽略的4个语义锚点与动态校准公式
  • 猫抓浏览器扩展:你的网页资源嗅探助手
  • Web安全攻防:XSS与CSRF漏洞原理、实战复现与防御策略详解
  • 解析 Markdown 文档
  • TIM 更新事件软件触发场景
  • 超级简单好用的C语言Log日志库!!(附代码库下载链接)
  • 语音修复终极指南:用AI技术让模糊语音重获新生
  • 鸿蒙 ArkTS 实战:Moving Box Manager 从状态建模到交互闭环完整解析
  • 数据科学与大数据技术毕业设计本科生方向推荐
  • 如何15分钟完成专业级黑苹果EFI配置:OpCore-Simplify让复杂变简单
  • 高级自定义技巧:MeEdu在线教育系统核心功能深度解析
  • 鸿蒙 ArkTS 实战:Knowledge Tree 从状态建模到交互闭环完整解析