ReactJS 多个用户角色的私有路由不起作用

问题描述 投票:0回答:1

我已经挣扎了一段时间,但仍然不知道如何让它发挥作用。我有一个私有路由,应该根据用户角色在客户端和管理员之间切换。

问题:如果用户角色是客户端,它将显示,如果是管理员,它将不会显示,但将从客户端读取重定向(客户端是添加的第一个私有路由,但我不知道如何使它们在之间切换)

登录时仅显示客户端。当用户角色是管理员时,我希望能够以管理员身份登录。客户就是客户,等等

一些帮助将不胜感激!

应用程序.jsx

function App() {

  const NewComp = NewHOC(AppRoutes);

  //CHECK FOR USER LOGGED IN
  const [user, setUser] = React.useState(null);

  const handleLogin = () => setUser(clientDetails);
  const handleLogout = () => setUser(null);

  return (
   <Aux>
      {user ? (
            <button onClick={handleLogout}>Sign Out</button>
        ) : (
            <button onClick={handleLogin}>Sign In</button>
      )}
      <Routes>
        {/* CLIENT ROUTE */}
        <Route path='/*' element={
        <ProtectedRoute redirectPath='/home'
                isAllowed={!!user && user.permissions.includes('star') && user.roles.includes('client')}
        >
          <div>The Client</div>
        </ProtectedRoute>} />

        {/* ADMIN ROUTE */}
        <Route path='/*' element={
        <ProtectedRoute redirectPath='/non-admin'
                isAllowed={!!user && user.roles.includes('admin')}
        >
          <div>The Admin</div>
        </ProtectedRoute>} />
        <Route path={"*"} element={ <Navigate replace to={ "/" }/> }/>
      </Routes>
  </Aux>
  )
}

ProtectedRoute.jsx

const ProtectedRoute = ({
    isAllowed,
    redirectPath = '/',
    children,
  }) => {
    if (!isAllowed) {
      return <Navigate to={redirectPath} replace />;
    }
  
    return children ? children : <Outlet />;
  };

客户详情

var clientDetails = {
    id: '1',
    name: 'Vio',
    permissions: ['star'],
    roles: ['client'],
}
javascript reactjs react-router react-router-dom
1个回答
0
投票

这里的问题是您在

"/"
上渲染了两条路线,因此只有第一条路线被匹配和渲染。

ProtectedRoute
应呈现为 布局路线,以便它包装实际具有路径的嵌套路线,例如实际路由本身上的受保护内容具有适当的路由路径。

示例:

function App() {
  const [user, setUser] = React.useState(null);

  const handleLogin = () => setUser(clientDetails);
  const handleLogout = () => setUser(null);

  return (
    <Aux>
      {user ? (
        <button onClick={handleLogout}>Sign Out</button>
      ) : (
        <button onClick={handleLogin}>Sign In</button>
      )}
      <Routes>
        <Route path="/" elemnent={<div>The safe home page</div>} />

        {/* CLIENT ROUTE */}
        <Route
          element={(
            <ProtectedRoute
              redirectPath="/" // <-- redirect to safe unprotected or non-client route
              isAllowed={!!user &&
                user.permissions.includes('star') &&
                user.roles.includes('client')
              }
            />
          )}
        >
          <Route path="client" element={<div>The Client</div>} />
          ... other client routes
        </Route>

        {/* ADMIN ROUTE */}
        <Route
          element={(
            <ProtectedRoute
              redirectPath="/" // <-- redirect to safe unprotected or non-admin route
              isAllowed={!!user &&
                user.roles.includes('admin')
              }
            />
          )}
        >
          <Route path="admin" element={<div>The Admin</div>} />
          ... other admin routes
        </Route>

        <Route path="*" element={<Navigate replace to="/" /> } />
      </Routes>
    </Aux>
  )
}
© www.soinside.com 2019 - 2024. All rights reserved.