Home > OS >  How to use protected route in react js?
How to use protected route in react js?

Time:04-27

I am facing some issue in protected routes in react js, please see below code:

import { Navigate, Outlet } from 'react-router-dom';
  
export const PrivateRoute = ( { auth } ) => {
    if (!auth) {
      return <Navigate to='/login' />;
    }
    return <Outlet />;
};

And than i put some login in App.js

<Route element={<PrivateRoute auth={auth} />} >
  <Route path="/dashboard" element={ <Dashboard /> } />
  <Route path="/strategies" element={ <Strategies /> } />
  <Route path="/deployed" element={ <Deployed /> } />
  <Route path="/subscribe-strategy" element={ <Subscribed /> } />
</Route>

What problem i am facing is , if i am on strategies page and than i refresh the page than the page redirected on dashboard, so i don't know how to fix this problem...

please let me know about this problem

CodePudding user response:

I am using this as private route this works for react-router v6

import React from "react";
import { useLocalStorage } from "hooks/useLocalStorage";
import { Navigate } from "react-router-dom";

const PrivateRoute = ({ redirectTo, component , isAuth }) => {
  return isAuth ?  component : <Navigate to={redirectTo} />;
};

export default PrivateRoute;

and using it like this

<Route
path="/"
element = {
<PrivateRoute redirectTo="/auth" component={<Home/>} isAuth={authntication}/>
}

CodePudding user response:

This is a clean way that I use react-router-dom v6.

1- I create a separated file named ProtectedRoutes

import { Navigate, Outlet } from "react-router-dom";

const useAuth = () => {
  const user = { loggedIn: localStorage.getItem("tokenId") };
  return user && user.loggedIn;
};

const ProtectedRoutes = () => {
  const isAuth = useAuth();
  return isAuth ? <Outlet /> : <Navigate to="/" />;
};

export default ProtectedRoutes;

2- Import above file and use it like this:

import React from "react";
import { BrowserRouter, Routes, Route } from "react-router-dom";
import other components that you need...

<BrowserRouter>
      <Routes>
        <Route path="*" element={<NotFoundPage />} />
        <Route path="/" element={<LoginPage />} />
        <Route element={<ProtectedRoutes />}>
          <Route path="/user-list" element={<UserListPage />} />
          <Route path="/add-user" element={<AddUserPage />} />
          <Route path="/user-details/:id" element={<UserDetailsPage />} />
          <Route path="/update-user/:id" element={<UpdateUserPage />} />
        </Route>
      </Routes>
    </BrowserRouter>

CodePudding user response:

I used specific component Routes tag.

My ProtectedRoute is here. İt is specific component.

const ProtectedRoute = ({ roles, children, isLoggedIn, role }) => {

    return isLoggedIn
        ? Array.from(roles).some(r => r === role || role === ROLE.ROLE_ADMIN)
            ? children
            : <Navigate to={PATH_DEFAULT} replace />
        : <Navigate to="/login" />

}

const mapStateToProps = (store) => {
    return {
        isLoggedIn: store.isLoggedIn,
        username: store.username,
        jwttoken: store.jwttoken,
        role: store.role,
        userId: store.userId
    };
};
export default connect(mapStateToProps)(ProtectedRoute);

RouteList variable is here.

export const  RouteBaseList = [
    {
        path : "*",
        roles : [ROLE.ROLE_ADMIN, ROLE.ROLE_MANAGER] ,
        element : <Navigate to="/"/>,
        key : PATH.PATH_DEFAULT,
        protectedRoute: false,
    },
    {
        path : PATH.PATH_DEFAULT,
        roles : [ROLE.ROLE_ADMIN, ROLE.ROLE_MANAGER] ,
        element : <HomePage />,
        key : PATH.PATH_DEFAULT,
        protectedRoute: true,
    },
    {
        path : PATH.PATH_INDEX,
        roles : [ROLE.ROLE_ADMIN, ROLE.ROLE_MANAGER] ,
        element : <HomePage />,
        key : PATH.PATH_INDEX,
        protectedRoute: true,
    },
...
...
]

I used map via route list variable.

  {
    RouteBaseList.map((route, index) =>
      <Route path={route.path} element={
        route.protectedRoute ?
        <ProtectedRoute roles={[...route.roles]}>
          {route.element}
        </ProtectedRoute>
        : 
        route.element
      } />
    )
  }

Routes is here.

<Routes>
  {routeList}
</Routes>
  • Related