我有一个受保护的路由,当用户登录时,我将用户详细信息保存在本地存储上.在受保护的路径中,我判断本地存储中的用户详细信息,如果为空,则重定向到登录页面,否则,用户可以访问所有选项卡,并且我有三个角色.我希望用户应该能够访问基于选项卡的角色.如果角色为仅限用户访问,则Dashboard和Admin应能够访问所有页面.如何判断用户角色,并根据角色授予访问权限?

这是我需要的Auth.js和代码.

import React from "react";
import { Navigate } from "react-router-dom";
export const RequireAuth = ({ children }) => {
  const user = localStorage.getItem("userInfo");
  if (!user) return <Navigate to="/login" />;
  return children;
};

这是我的布局文件

import React from "react";
import { Outlet } from "react-router-dom";
import Sidebar from "../../components/Sidebar";
import Headers from "../../components/Header";
import { RequireAuth } from "../../shared/requireAuth";


const Layout = () => {
  return (
    <>
      <RequireAuth>
        <div className="container-fluid">
          <div className="row">
            <Sidebar />
            <div className="col-md-9 ms-sm-auto col-lg-10 px-0  ">
              <Headers />
              <div className="px-lg-5 px-3 py-3">
                <Outlet />
              </div>
            </div>
          </div>
        </div>
        
      </RequireAuth>
    </>
  );
};

export default Layout;

这是我在App.js上的路由

<Route path="/" element={<Layout />}>
  <Route path="/users" element={<UserList />} />
  <Route path="/adduser" element={<AddUser />} />
  <Route path="/dashboard" element={<Dashboard />} />
</Route>;

如果用户没有访问该页面的权限,则重定向此路由.

   <Route path="/unauthorized" element={<Unauthorized />} />

推荐答案

创建一条RoleAccess布局路由,从本地存储中读取role,并将其与可以访问该路由的角色列表进行比较.

示例:

const RoleAccess = ({ roles = [] }) => {
  const user = JSON.parse(localStorage.getItem("userInfo"));
  return !roles.length || roles.includes(user?.role)
    ? <Outlet />
    : <Navigate to="/unauthorized" replace />;
};

...

<Route path="/" element={<Layout />}>
  <Route element={<RoleAccess roles={["user", "admin"]} />}>
    <Route path="/dashboard" element={<Dashboard />} />
  </Route>
  <Route element={<RoleAccess roles={["admin"]} />}>
    <Route path="/users" element={<UserList />} />
    <Route path="/adduser" element={<AddUser />} />
  </Route>
</Route>;

Reactjs相关问答推荐

如何在useEffect中使用useParams()

如何在没有 node 模块的情况下利用外部Java脚本文件制作OWL carousel

将cy.get()与动态类名一起使用?

如何在物料界面react 的多选菜单中设置最大 Select 数限制

如何在React组件中自动更新图表数据?

Material-UI 和 React Hook 表单不记录值

ReactJS 共享上下文

React Native - 如何处理错误带有有效负载的NAVIGATE操作..未被任何导航器处理?

我可以在加载器函数中多次 fetch() 并使用一次 useloaderdata() 提取它吗?

如何在PrimeReact的表格中修改筛选图标功能

React 组件列表中的第一个计时器正在获取值 NaN

当我在 React Router Dom 中使用两个参数并直接在页面上导航时,数据获取没有发生

如何在 React.js 中提取 PDF 的内容?

我应该如何将字符串作为props 传递给 React 组件?

部署到github pages时请求路径错误

单元测试 useLoaderData() react-router v6 加载器函数

模块解析失败:意外令牌 (257:106) 您可能需要适当的加载程序来处理此文件类型

如何在 React 中的 Material Ui 多选中设置默认值?

为什么 state redux-toolkit 是代理?

在 Redux 中更新布尔状态时出错