You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React实现基于角色的授权后访问权限页面出现无限刷新问题求助

问题原因

  • 缺少/page-error-404的路由配置,且该页面未排除权限校验
    你当前的路由列表中没有定义404页面对应的路由规则,权限校验不通过触发重定向到该地址时,<Switch>无法匹配到对应路由,会反复触发路由匹配和校验逻辑,形成重定向循环。
  • localStorage读取逻辑缺少异常捕获,易触发渲染报错
    你在CheckUser和CheckAdmin中直接读取JSON.parse(localStorage.getItem("ConnectedUser"))[0]['Role'],如果localStorage中不存在ConnectedUser字段、存储内容不是合法JSON、或者存储内容不是数组结构,都会直接抛出JS异常,导致页面渲染失败触发自动重加载,形成无限刷新。
  • 权限判断逻辑存在边界疏漏
    你只判断了item !== null,但没有处理item为undefined、localStorage读取失败的场景,这类异常场景都会触发重定向分支,如果重定向逻辑存在问题就会形成循环。

修复方案

1. 补全404页面的路由配置

在路由列表末尾添加无角色限制的404路由,确保重定向后可以正常匹配:

{ url: "ecom-orders", component: Orders, role:'admin' },
{ url: "ecom-myorders", component: Myorders, role:'user' },
{ url: "ecom-ordersbyuser/:userid", component: OrdersByUser },
{ url: "AddProduct", component: AddProduct, role:'admin' },
// 新增404路由,不要加role属性
{ url: "page-error-404", component: PageError404 },

2. 给localStorage读取逻辑加异常捕获和边界处理

修改CheckUser和CheckAdmin的代码,增加容错处理:

const CheckUser = ({ component: Component, ...props }) => (
  <Route
    {...props}
    render={routeProps => {
      let role = null;
      // 捕获读取异常
      try {
        const userData = JSON.parse(localStorage.getItem("ConnectedUser"));
        if (Array.isArray(userData) && userData.length > 0) {
          role = userData[0]?.Role;
        }
      } catch (e) {
        console.error("读取用户权限失败", e);
      }
      return role == 1 ? (            
        <Component {...routeProps} />                     
      ) : (
        <Redirect to="/page-error-404" />  
      );
    }}
  />
);

const CheckAdmin = ({ component: Component, ...rest }) => (
  <Route
    {...rest}
    render={props => {
      let role = null;
      try {
        const userData = JSON.parse(localStorage.getItem("ConnectedUser"));
        if (Array.isArray(userData) && userData.length > 0) {
          role = userData[0]?.Role;
        }
      } catch (e) {
        console.error("读取用户权限失败", e);
      }
      return role == 2 ? (
        <Component {...props} />
      ) : (           
        <Redirect to="/page-error-404" />  
      );
    }}
  />
);

3. 可选优化

建议不要用数组索引作为路由的key,可以改用data.url作为key,避免路由顺序调整时出现异常渲染问题。

内容的提问来源于stack exchange,提问作者Ahmed Mhadhbi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:15:00