当前位置:首页 > 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
分享给朋友:

相关文章

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何查

react如何查

React 查询方法 React 提供了多种查询 DOM 元素的方式,以下是几种常见的方法: 使用 ref 通过 useRef 钩子可以获取 DOM 节点的引用,适用于直接操作 DOM 的场景。…

react如何卸载

react如何卸载

卸载 React 项目或依赖 如果需要完全卸载 React 项目或相关依赖,可以按照以下步骤操作: 删除项目文件夹 直接删除整个项目文件夹是最彻底的方式。确保已备份重要代码或配置文件。 卸载全局安…

react 如何启动

react 如何启动

创建 React 项目 使用官方工具 create-react-app 快速初始化项目,需提前安装 Node.js(版本 ≥ 14.0.0)和 npm/yarn: npx create-react-…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react如何重启

react如何重启

重启 React 应用的方法 重新加载当前页面 使用 window.location.reload() 强制刷新页面,这会重新加载整个应用并重置所有状态。 window.location…