Управление доступом в React: Ролевая маршрутизация для начинающих

На список статей
Blog image

Track My Time — Управляй временем эффективно и достигай большего!
"Ваш незаменимый помощник в управлении проектами и учете времени! Отслеживайте задачи, распределяйте ресурсы и контролируйте каждую минуту работы. Повышайте эффективность, упрощайте процессы и достигайте результатов быстрее. Начните работать с нами и добейтесь успеха вместе!"

Понимание ролевой маршрутизации

Ролевая маршрутизация — это подход, который позволяет ограничивать доступ к определенным страницам или компонентам вашего приложения в зависимости от роли пользователя. Например, администраторы могут видеть панель управления, а обычные пользователи — нет.

Шаг 1: Создание ролей и данных пользователя
Для начала создайте простой объект, который будет имитировать текущего пользователя и его роль.

const currentUser = {
 name: "John Doe",
 role: "admin", // Возможные роли: "user", "admin", "guest"
};

Шаг 2: Определение маршрутов
Маршруты в React можно организовать с помощью react-router-dom. Установите эту библиотеку, если она еще не добавлена, с помощью команды:

npm install react-router-dom

Создайте основные маршруты:

import { BrowserRouter as Router, Route, Routes, Navigate } from "react-router-dom";

function App() {
 return (
   <Router>
     <Routes>
       <Route path="/" element={<HomePage />} />
       <Route path="/admin" element={<AdminPage />} />
       <Route path="/user" element={<UserPage />} />
       <Route path="*" element={<NotFoundPage />} />
     </Routes>
   </Router>
 );
}

Шаг 3: Создание компонентов страниц
Для каждой страницы создайте отдельные компоненты, например:

function HomePage() {
 return <h1>Welcome to the Home Page</h1>;
}

function AdminPage() {
 return <h1>Welcome, Admin!</h1>;
}

function UserPage() {
 return <h1>Hello, User!</h1>;
}

function NotFoundPage() {
 return <h1>404 - Page Not Found</h1>;
}

Настройка ролевого доступа

Теперь, когда маршруты и страницы готовы, добавим проверку ролей.

Шаг 4: Создание компонента для защиты маршрутов
Создайте компонент ProtectedRoute, который будет проверять роль пользователя перед тем, как предоставить доступ к определенному маршруту:

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

function ProtectedRoute({ element, allowedRoles }) {
 if (!allowedRoles.includes(currentUser.role)) {
   return <Navigate to="/" replace />;
 }
 return element;
}

Шаг 5: Использование ProtectedRoute
Обновите настройки маршрутов, чтобы использовать новый компонент:

<Routes>
 <Route path="/" element={<HomePage />} />
 <Route
   path="/admin"
   element={<ProtectedRoute element={<AdminPage />} allowedRoles={["admin"]} />}
 />
 <Route
   path="/user"
   element={<ProtectedRoute element={<UserPage />} allowedRoles={["user", "admin"]} />}
 />
 <Route path="*" element={<NotFoundPage />} />
</Routes>

Теперь только пользователи с ролью admin смогут зайти на /admin, а /user будет доступна как для пользователей, так и для администраторов.

Расширение функциональности

Чтобы сделать приложение более гибким и масштабируемым, можно добавить управление ролями через контекст.

Шаг 6: Создание контекста аутентификации
Добавьте новый контекст:

import { createContext, useContext, useState } from "react";

const AuthContext = createContext();

export function AuthProvider({ children }) {
 const [user, setUser] = useState({ name: "John Doe", role: "guest" });

 const login = (newUser) => setUser(newUser);
 const logout = () => setUser({ name: "", role: "guest" });

 return (
   <AuthContext.Provider value={{ user, login, logout }}>
     {children}
   </AuthContext.Provider>
 );
}

export function useAuth() {
 return useContext(AuthContext);
}

Шаг 7: Подключение контекста
Обновите App:

function App() {
 return (
   <AuthProvider>
     <Router>
       <Routes>
         <Route path="/" element={<HomePage />} />
         <Route
           path="/admin"
           element={<ProtectedRoute element={<AdminPage />} allowedRoles={["admin"]} />}
         />
         <Route
           path="/user"
           element={<ProtectedRoute element={<UserPage />} allowedRoles={["user", "admin"]} />}
         />
         <Route path="*" element={<NotFoundPage />} />
       </Routes>
     </Router>
   </AuthProvider>
 );
}

Шаг 8: Управление входом и выходом
Теперь добавьте кнопки для входа и выхода на главной странице:

function HomePage() {
 const { user, login, logout } = useAuth();

 return (
   <div>
     <h1>Welcome to the Home Page</h1>
     {user.role === "guest" ? (
       <>
         <button onClick={() => login({ name: "Admin", role: "admin" })}>
           Login as Admin
         </button>
         <button onClick={() => login({ name: "User", role: "user" })}>
           Login as User
         </button>
       </>
     ) : (
       <>
         <p>Logged in as: {user.name} ({user.role})</p>
         <button onClick={logout}>Logout</button>
       </>
     )}
   </div>
 );
}

Теперь приложение готово управлять доступом пользователей к разным маршрутам на основе их ролей!

Эти шаги помогут вам создать базовую систему ролевой маршрутизации в React. Вы сможете расширить её, добавляя более сложные проверки, интеграцию с API или дополнительные роли. Управление доступом — важный аспект веб-разработки, и понимание этой темы сделает ваши приложения безопаснее и удобнее для пользователей. Удачи в ваших проектах! 🚀

Комментарии

Пока нет комментариев

Добавить комментарий