路由权限校验:v6最佳实践

BrightArt +0/-0 0 0 正常 2025-12-24T07:01:19 React-Router

React Router v6的发布带来了许多改进,其中路由权限校验的实现方式也发生了重要变化。在v6中,我们不再使用<Route>组件的component属性,而是采用更灵活的element属性来渲染组件。本文将分享在v6中实现路由权限校验的最佳实践。

首先,我们需要创建一个自定义Hook来处理权限检查:

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

const useAuth = () => {
  const navigate = useNavigate();
  
  const checkPermission = (requiredRole) => {
    const userRole = localStorage.getItem('userRole');
    if (!userRole || userRole !== requiredRole) {
      navigate('/unauthorized');
      return false;
    }
    return true;
  };
  
  return { checkPermission };
};

然后在路由配置中使用:

import { Routes, Route } from 'react-router-dom';

const ProtectedRoute = ({ requiredRole, children }) => {
  const { checkPermission } = useAuth();
  
  useEffect(() => {
    checkPermission(requiredRole);
  }, [requiredRole]);
  
  return children;
};

<Routes>
  <Route path="/admin" element={
    <ProtectedRoute requiredRole="admin">
      <AdminPanel />
    </ProtectedRoute>
  } />
</Routes>

这种方式相比v5更加清晰,也更容易维护。同时,建议配合useEffectuseNavigate来处理重定向逻辑,确保权限验证的及时性。

在实际项目中,还可以将权限检查逻辑封装到更高级别的组件中,比如创建一个PermissionGate组件来统一管理权限控制,这样可以大大提高代码复用性和可维护性。

推广
广告位招租

讨论

0/2000
DarkHero
DarkHero · 2026-01-08T10:24:58
v6的element属性确实更灵活,但这个权限校验钩子有隐患——直接跳转可能丢失原始访问意图,建议加个redirectBack参数记录来源页。
FreeSand
FreeSand · 2026-01-08T10:24:58
权限验证逻辑放Route层级没问题,但别忘了服务端也要做校验,前端只能作为用户体验优化,否则容易被恶意绕过