Механизмы маршрутизации в реагирующих веб-приложениях обрабатываются с помощью библиотеки под названием react-rotuer-dom, это мощная библиотека, которая позволяет легко реализовать динамическую маршрутизацию на основе компонентов.

В сценарии, когда нам нужно защитить определенную страницу на уровне навигации браузера, нам нужно реализовать собственный защищенный маршрут для обработки логики. Последняя версия (v6) react-router-dom делает этот процесс намного проще, чем раньше.

Итак, давайте посмотрим, как мы можем реализовать защищенный маршрут в react-router-dom v6 в react.

Позвольте мне продемонстрировать процесс на примере разработанного мной приложения. Это очень простое приложение со структурой папок, как показано ниже.

src
├── components
│   └── ProtectedRoute
├── scenes
│   ├── Home
│   ├── About
│   ├── MyAccount
│   └── Unauthorized
└── App.js

Шаг 1

Установите реактивный маршрутизатор

npm install react-router-dom
or
yarn add react-router-dom

Шаг 2

Откройте App.js и определите маршруты, как показано ниже:

const App = () => {
    return (
        <BrowserRouter>
            <Routes>
                <Route exact path="/home" element={<Home/>}/>
                <Route path="/about" element={<About/>}/>
                <Route 
                   path={"/unauthorized"} 
                   element={<UnAuthorized/>}
                />
                <Route 
                   path="/my-account" 
                   element={<MyAccount/>}
                />
            </Routes>
        </BrowserRouter>
    );
};

Что следует отметить,

BrowserRouter используется для синхронизации вашего пользовательского интерфейса с URL-адресом.

Тег Switch больше не присутствует в версии 6 react-router-dom, теперь он заменен на Routes, поэтому все определения Route должны быть обернуты с тегом Маршруты

Атрибут компонента в Route заменен элементом.

Шаг 3

Теперь создайте новый компонент с именем ProtectedRoute, как показано ниже.

const ProtectedRoute = ({ component }) => {
    if (localStorage.getItem("isLoggedIn")==="true") {
        return component;
    } else {
        return <Navigate to="/unauthorized"/>;
    }
}

Здесь мы просто создаем компонент-оболочку как ProtectedRoute и возвращаем передачу компонента, который необходимо защитить, в качестве реквизита, затем мы обрабатываем логику и соответствующим образом возвращаем компонент. В этой логике он возвращает компонент только в том случае, если для свойства isLoggedIn в локальном хранилище установлено значение true.

Если текущие условия нарушают логику, мы переходим к неавторизованному компоненту, который может показать пользователю некоторые рекомендации или сообщения.

Что следует отметить,

Тег перенаправления заменен тегом Navigate в версии 6.

Шаг 4

Наконец, вам нужно просто изменить маршрут /my-account в App.js, как показано ниже. Компонент, который нам нужно защитить, — это MyAccount.

<Route 
   path="/my-account" 
   element={<ProtectedRoute component={<MyAccount/>}/>}
/>

Поскольку компонент больше не является дочерним элементом Route, нам не нужно передавать реквизиты, связанные с Route, в ProtectedRoute, поэтому ProtectedRoute теперь является просто оболочкой для соответствующего компонента. Мы просто передаем оболочку ProtectedRoute в качестве элемента маршрутизатору.

Что следует отметить,

Вы можете передать больше реквизитов, кроме компонента, в соответствии с вашей логикой.

Вот и все! Надеюсь, все понятно, не стесняйтесь делиться любыми предложениями или вопросами. Спасибо.!