当前位置:首页 > React

react实现路由鉴权

2026-01-27 15:50:45React

路由鉴权实现方案

React中实现路由鉴权通常结合react-router-dom库,通过高阶组件或自定义路由组件控制权限。以下是几种常见方法:

使用高阶组件封装

创建高阶组件包裹需要鉴权的路由组件,检查用户权限后决定是否渲染:

react实现路由鉴权

import { Navigate } from 'react-router-dom';

const withAuth = (Component, requiredRole) => {
  return (props) => {
    const userRole = localStorage.getItem('userRole');

    if (userRole !== requiredRole) {
      return <Navigate to="/login" replace />;
    }

    return <Component {...props} />;
  };
};

// 使用示例
const AdminPage = withAuth(AdminComponent, 'admin');

自定义路由组件

创建ProtectedRoute组件替代原生Route,集成权限检查逻辑:

function ProtectedRoute({ roles, children }) {
  const currentUser = useAuth(); // 自定义hook获取用户信息

  if (!currentUser || !roles.includes(currentUser.role)) {
    return <Navigate to="/unauthorized" />;
  }

  return children;
}

// 路由配置中使用
<Routes>
  <Route path="/admin" element={
    <ProtectedRoute roles={['admin']}>
      <AdminDashboard />
    </ProtectedRoute>
  }/>
</Routes>

全局路由拦截

在根路由组件中进行统一鉴权处理,适用于简单场景:

react实现路由鉴权

function RouterWrapper() {
  const location = useLocation();
  const isAuthenticated = checkAuth(); // 认证状态检查

  if (location.pathname.startsWith('/admin') && !isAuthenticated) {
    return <Navigate to="/login" state={{ from: location }} />;
  }

  return <Outlet />;
}

动态路由加载

结合懒加载实现按权限动态生成路由表:

function generateRoutes(userRole) {
  const commonRoutes = [
    { path: '/', element: <HomePage /> }
  ];

  const adminRoutes = userRole === 'admin' 
    ? [{ path: '/admin', element: <AdminPage /> }] 
    : [];

  return [...commonRoutes, ...adminRoutes];
}

function App() {
  const routes = generateRoutes(currentUser.role);
  return <Routes>{routes.map(route => <Route {...route} />)}</Routes>;
}

权限存储方案

  • JWT验证:从token解析用户角色
  • Redux/Context:全局状态管理权限信息
  • 服务端验证:通过API实时校验权限
// JWT解码示例
function checkToken() {
  const token = localStorage.getItem('token');
  const decoded = jwt.decode(token);
  return decoded?.role || 'guest';
}

错误处理

添加统一的未授权处理页面,并保留跳转来源:

<Route path="/unauthorized" element={
  <div>
    无权限访问
    <button onClick={() => navigate(-1)}>返回</button>
  </div>
} />

以上方案可根据项目复杂度组合使用,建议中型以上项目采用高阶组件+动态路由方案,小型项目可采用全局拦截方案。

标签: 路由react
分享给朋友:

相关文章

动态路由的实现vue

动态路由的实现vue

动态路由的实现(Vue) 在Vue中实现动态路由通常涉及以下方法,适用于Vue Router的配置和管理: 使用路由参数 通过:定义动态路径参数,在组件中通过$route.params访问: //…

vue路由实现思路

vue路由实现思路

Vue 路由实现思路 Vue 路由的核心是通过 Vue Router 库实现的单页面应用(SPA)路由管理。以下是关键实现思路和步骤: 安装 Vue Router 通过 npm 或 yarn 安装…

vue路由实现原理

vue路由实现原理

Vue 路由实现原理 Vue Router 是 Vue.js 的官方路由管理器,其核心原理基于前端路由的实现方式,主要包括哈希模式(Hash Mode)和历史模式(History Mode)。 哈希…

vue 路由实现

vue 路由实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的基本步骤: 安装 Vue Router 使用 npm 或 y…

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

vue路由实现

vue路由实现

Vue 路由实现方法 安装 Vue Router 在项目中安装 Vue Router 依赖包: npm install vue-router 配置路由 在 src 目录下创建 router/ind…