페이지 중 누구나 진입이 가능한 페이지와, 로그인한 회원만 진입이 가능한 페이지 또는 로그인 한 회원은 진입하지 못하는 페이지 (예: login 페이지) , 관리자만 진입이 가능한 페이지가 있다.
이러한 인증 들은 어떻게 할 수 있을까?
이런 경우 higher-order component function
을 사용하면 된다.
higher-order component function
은 컴포넌트를 인자로 받아 새로운 컴포넌트를 리턴하는 함수이다.src/hoc/auth.js
에 아래와 같이 파일을 만든다.import React, { useEffect } from 'react';
import { useSelector } from 'react-redux';
export default (SpecialComponent, option, adminRoute=null) => {
/*
예) option: null -> 누구나 출입이 가능한 페이지 (home)
true -> 로그인한 유저만 출입이 가능한 페이지
false -> 로그인한 유저는 출입이 불가능한 페이지
*/
const AuthenticateCheck = (props) => {
const isLoggedIn = useSelector(state => state.user.isLoggedIn);
useEffect(() => {
if (!isLoggedIn && option) {
props.history.push('/login');
}
}, []);
return (
<SpecialComponent />
)
};
return AuthenticateCheck;
};
auth.js
파일을 불러온다.src/App.js
에서 hoc에 component와 option에 인자를 넣어 페이지들의 접근 권한을 컨트롤한다.import React from 'react';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import { useSelector } from 'react-redux';
import Auth from './hoc/auth';
import Header from './components/Header/Header';
import MainPage from './components/MainPage/MainPage';
import LoginPage from './containers/LoginPage/LoginPage';
import SignUpPage from './components/SignUpPage/SignUpPage';
import AdminPage from './components/AdminPage/AdminPage';
import Menu from './components/Menu/Menu';
function App() {
const isLoggedIn = useSelector(state => state.user.isLoggedIn);
return (
<div className="App">
<BrowserRouter>
<Header />
{isLoggedIn && <Menu />}
<Switch>
<Route path='/' exact component={Auth(MainPage, null)} />
<Route path='/login' component={Auth(LoginPage, false)} />
<Route path='/signUp' component={Auth(SignUpPage, false)} />
/*
예) 관리자 페이지 세 번째 인자에 true라는 옵션을 주어 관리자만
들어갈 수 있는 페이지를 인증할 수 있다.
*/
<Route path='/admin' component={Auth(AdminPage, true, true)} />
</Switch>
</BrowserRouter>
</div>
);
};
export default App;