Сегодня я воспользуюсь пользовательским хуком и создам авторизацию для администратора и других ролей менеджера.

Давайте начнем с создания пользовательского хука как useUserRole.js

import {useEffect} from 'react';
import { toast } from 'react-toastify';

import {useAuth} from './useAuth';

export const useUserRole = (allowedRoles) => {

 const {session} = useAuth();

 if (!allowedRoles.includes(session?.user?.role)) {
 localStorage.removeItem('session')
 window.location.reload()
 toast.error(`Unauthorized`)
 };

 return true
}

Здесь useAuth — это настраиваемый хук, который упаковывает возвращаемое значение из хука useContext, предоставленного для всех приложений, которые используют, чтобы увидеть, вошел ли пользователь в систему или нет.

import {useContext} from 'react';

import { AuthContext } from '../context/AuthProvider';

//simply returning the context value for reusing auth hook
export const useAuth = () => {
  return useContext(AuthContext)
};

В компоненте AuthContext мы использовали сведения о сеансе или пользователе для хранения в локальном хранилище.

import {createContext, useState} from 'react';

import { getSession, setSessionInLocalStorage } from '../_helpers/crud/Auth';

//extracting session or userdetails value from localstorage
export const AuthContext = createContext(getSession() || '');

const AuthProvider = (props) => {

  const auth = getSession();

  const [session, setSession] = useState(auth || '');

  const setAuth = (token) => {
    setSession(token)
    setSessionInLocalStorage(token)
  };

  const value = {
    session,
    setAuth,
  };

  return(
 <AuthContext.Provider value={value}>{props.children}</AuthContext.Provider>
 )
}

export default AuthProvider

Здесь мы создали кастомный хук, который принимает allowRoles, и мы проверяем разрешенные роли с ролью в нашем сеансе во время входа в систему.

здесь условие: если allowRoles равно роли в сеансе, то им разрешено просматривать предоставленный маршрут, иначе они будут перенаправлены на страницу входа.

Теперь мы можем указать роли.

//predefined-static roles
export const ROLE = {
 Admin: 'Admin',
 Manager: 'Manager',
 User: 'User'
};

Теперь в любом компоненте, таком как Blog.js

import React, { useState } from 'react';

import { useUserRole } from '../../../hooks/useUserRole';
//accessing role pre-defined
import { ROLE } from '../../../_helpers/Role'

const Blog = () => {
//checking the role
 useUserRole([ROLE.Admin]);
return ( 
 <>Blog page can be accessed only by admin</>
 )
};

export default Blog

#Conclusion

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