v6路由权限验证

晨曦微光 +0/-0 0 0 正常 2025-12-24T07:01:19 React-Router · 权限验证

React Router v6的路由权限验证实现

在React Router v6中,路由权限验证需要通过新的API来实现。相比v5,v6移除了Route组件的componentrender属性,转而使用element属性来渲染组件。

基本权限验证实现

首先创建一个权限验证高阶组件:

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

const ProtectedRoute = ({ children, requiredRole }) => {
  const user = useAuth(); // 自定义认证hook
  
  if (!user) {
    return <Navigate to="/login" replace />;
  }
  
  if (requiredRole && !user.roles.includes(requiredRole)) {
    return <Navigate to="/unauthorized" replace />;
  }
  
  return children;
};

路由配置示例

import { createBrowserRouter, RouterProvider } from 'react-router-dom';

const router = createBrowserRouter([
  {
    path: '/',
    element: <Home />, // 公开路由
  },
  {
    path: '/dashboard',
    element: (
      <ProtectedRoute requiredRole="admin">
        <Dashboard />
      </ProtectedRoute>
    ),
  },
  {
    path: '/profile',
    element: (
      <ProtectedRoute>
        <Profile />
      </ProtectedRoute>
    ),
  }
]);

function App() {
  return <RouterProvider router={router} />;
}

复杂权限场景

对于更复杂的权限控制,可以结合useLocation和自定义Hook:

const useAuth = () => {
  const [user, setUser] = useState(null);
  
  useEffect(() => {
    // 模拟认证逻辑
    const token = localStorage.getItem('token');
    if (token) {
      // 验证token并获取用户信息
      setUser({ id: 1, roles: ['user', 'admin'] });
    }
  }, []);
  
  return user;
};

注意事项

  1. v6不再支持Route组件的component属性,必须使用element
  2. 权限验证需在路由层级进行,避免组件内部验证
  3. 建议统一管理认证状态和权限逻辑
  4. 使用Navigate组件进行重定向时需要设置replace属性

通过以上方式可以实现完整的v6路由权限验证方案。

推广
广告位招租

讨论

0/2000
Diana161
Diana161 · 2026-01-08T10:24:58
v6路由权限验证别看文档说简单,实际项目里容易踩坑,特别是嵌套路由和动态权限切换,建议先在测试环境跑通再上线。
DryXavier
DryXavier · 2026-01-08T10:24:58
别只用角色判断权限,用户状态比如是否登录、是否被禁用也要考虑进去,不然可能有安全漏洞。
StrongWizard
StrongWizard · 2026-01-08T10:24:58
ProtectedRoute组件写法要注意,如果直接return children可能导致组件未卸载的问题,最好加个key值。
算法架构师
算法架构师 · 2026-01-08T10:24:58
路由层级太深时,权限验证容易失效,建议统一在路由入口做全局权限拦截,而不是每个页面都写一遍。
Piper494
Piper494 · 2026-01-08T10:24:58
用createBrowserRouter替代Switch后,错误边界和路由回退机制要重新设计,不然用户可能卡在空白页。
CoolCode
CoolCode · 2026-01-08T10:24:58
别把所有权限逻辑都塞进一个Hook里,拆分成useAuth、usePermission等独立模块,方便维护和测试。
Helen846
Helen846 · 2026-01-08T10:24:58
权限验证最好配合后端API做双重校验,前端只是第一道防线,别觉得v6路由就够用了。
Nina570
Nina570 · 2026-01-08T10:24:58
使用Navigate组件跳转时记得加replace属性,避免用户按返回键回到登录页导致死循环。
Quinn250
Quinn250 · 2026-01-08T10:24:58
权限控制逻辑建议用状态管理工具统一维护,比如Redux或Context,不然多个组件同时调用会出问题。
Julia902
Julia902 · 2026-01-08T10:24:58
实际项目中发现v6的element属性在某些场景下不支持children传参,最好提前测试好兼容性再使用。