v6路由权限控制

Frank540 +0/-0 0 0 正常 2025-12-24T07:01:19 React Router · 权限控制

React Router v6 路由权限控制实践

React Router v6 相比 v5 在路由权限控制方面有了显著变化,主要体现在 useNavigateuseLocation 钩子的使用上。本文将分享如何在 v6 中实现安全的路由权限控制。

核心变化

v6 中移除了 Switch 组件,改用 Routes,同时路由匹配机制变为严格匹配。权限控制逻辑需要通过 useNavigateuseLocation 来实现。

实现方案

// 权限守卫组件
const ProtectedRoute = ({ children }) => {
  const navigate = useNavigate();
  const location = useLocation();
  
  useEffect(() => {
    const isAuthenticated = checkUserAuth(); // 自定义认证检查
    if (!isAuthenticated) {
      navigate('/login', { 
        replace: true,
        state: { from: location } 
      });
    }
  }, [navigate, location]);
  
  return children;
};

使用示例

<Routes>
  <Route path="/login" element={<Login />} />
  <Route 
    path="/dashboard" 
    element={
      <ProtectedRoute>
        <Dashboard />
      </ProtectedRoute>
    }
  />
</Routes>

高级权限控制

对于更细粒度的权限控制,可以结合角色系统:

const RoleBasedRoute = ({ roles, children }) => {
  const userRole = getUserRole();
  const hasPermission = roles.includes(userRole);
  
  if (!hasPermission) {
    return <Navigate to="/unauthorized" replace />;
  }
  
  return children;
};

通过以上方式,可以在 v6 中实现灵活且安全的路由权限控制。

推广
广告位招租

讨论

0/2000
BoldMike
BoldMike · 2026-01-08T10:24:58
v6的路由权限控制确实更灵活了,但这种实现方式在嵌套路由时容易出现无限重定向问题,建议加个标志位判断。
Paul324
Paul324 · 2026-01-08T10:24:58
用useEffect做权限校验太粗暴了,应该结合store状态管理,在登录态变更时统一处理跳转逻辑。
Max583
Max583 · 2026-01-08T10:24:58
ProtectedRoute写法没问题,但别忘了把auth检查逻辑抽成hook,不然每个组件都要重复写一遍。
每日灵感集
每日灵感集 · 2026-01-08T10:24:58
角色控制那块可以再细化,比如用Context+useContext组合实现权限上下文,避免层层传递props。
BadLeaf
BadLeaf · 2026-01-08T10:24:58
现在路由权限基本都是前端控制,但要考虑后端接口也得配合做验证,别只靠前端跳转掩盖安全漏洞。
天空之翼
天空之翼 · 2026-01-08T10:24:58
导航守卫的逻辑应该在路由加载前就判断好,而不是等组件渲染完再跳转,性能和体验都不够好。
WellMouth
WellMouth · 2026-01-08T10:24:58
建议把登录页和无权限页做成可配置的组件,这样项目复用性更高,也能避免重复写基础页面。
魔法少女酱
魔法少女酱 · 2026-01-08T10:24:58
别忘了处理刷新场景下的权限状态恢复问题,localStorage/sessionStorage结合useEffect做初始化。
BlueOliver
BlueOliver · 2026-01-08T10:24:58
权限控制逻辑如果放在路由层,会跟业务逻辑耦合太紧。建议抽象成独立的权限服务模块,便于维护。