박민정

[feat] Create page access authority with login state

Showing 35 changed files with 92 additions and 24 deletions
1 -
2 import React from "react"; 1 import React from "react";
3 import { 2 import {
4 BrowserRouter as Router, 3 BrowserRouter as Router,
5 Switch, 4 Switch,
6 Route, 5 Route,
7 - Link 6 + //Link
8 } from "react-router-dom"; 7 } from "react-router-dom";
9 8
10 import LandingPage from './components/views/LandingPage/LandingPage' 9 import LandingPage from './components/views/LandingPage/LandingPage'
11 import LoginPage from './components/views/LoginPage/LoginPage' 10 import LoginPage from './components/views/LoginPage/LoginPage'
12 import RegisterPage from './components/views/RegisterPage/RegisterPage' 11 import RegisterPage from './components/views/RegisterPage/RegisterPage'
13 - 12 +import auth from './hoc/authentication'
14 13
15 function App() { 14 function App() {
16 return ( 15 return (
17 <Router> 16 <Router>
18 <div> 17 <div>
19 - {/*
20 - A <Switch> looks through all its children <Route>
21 - elements and renders the first one whose path
22 - matches the current URL. Use a <Switch> any time
23 - you have multiple routes, but you want only one
24 - of them to render at a time
25 - */}
26 <Switch> 18 <Switch>
27 - <Route exact path="/"> 19 + {/* null, false에 대한 옵션 설명은 auth로 가서 확인*/}
28 - <LandingPage /> 20 +
29 - </Route> {/* 21 + <Route exact path="/" component={auth(LandingPage, null)} />
30 - <Route exact path="/" component={LandingPage} /> 로 해도 똑같은 결과가 나옴!
31 - */}
32 22
33 - <Route path="/login"> 23 + <Route exact path="/login" component={auth(LoginPage, false)}/>
34 - <LoginPage />
35 - </Route>
36 24
37 - <Route path="/register"> 25 + <Route exact path="/register" component={auth(RegisterPage, false)}/>
38 - <RegisterPage /> 26 +
39 - </Route> 27 + {/*
28 + <Route exact path="/" component={LandingPage} />
29 +
30 + <Route exact path="/login" component={LoginPage}/>
31 +
32 + <Route exact path="/register" component={RegisterPage}/>
33 + */}
40 </Switch> 34 </Switch>
41 </div> 35 </div>
42 </Router> 36 </Router>
......
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
2 2
3 export const LOGIN_USER = "login_user"; 3 export const LOGIN_USER = "login_user";
4 export const REGISTER_USER = "resgier_user"; 4 export const REGISTER_USER = "resgier_user";
5 +export const AUTH_USER = "auth_user";
...\ No newline at end of file ...\ No newline at end of file
......
1 import axios from 'axios'; 1 import axios from 'axios';
2 import { 2 import {
3 LOGIN_USER, 3 LOGIN_USER,
4 - REGISTER_USER 4 + REGISTER_USER,
5 + AUTH_USER
5 } from './types'; 6 } from './types';
6 export function loginUser(logInfo) { 7 export function loginUser(logInfo) {
7 const request = axios.post('/api/users/login', logInfo) // logInfo를 post로 전달 8 const request = axios.post('/api/users/login', logInfo) // logInfo를 post로 전달
...@@ -21,7 +22,7 @@ export function RegisterUser(regInfo) { ...@@ -21,7 +22,7 @@ export function RegisterUser(regInfo) {
21 const request = axios.post('/api/users/register', regInfo) // logInfo를 post로 전달 22 const request = axios.post('/api/users/register', regInfo) // logInfo를 post로 전달
22 .then(response => response.data); // 서버에서 받은 데이터를 request에 저장 23 .then(response => response.data); // 서버에서 받은 데이터를 request에 저장
23 24
24 - return { // return을 통해 Reducer로 보냄 25 + return { // return을 통해 Reducer로 보냄.
25 // Reducer에서 previousState, action을 이용해 nextState로 만들기 때문 :: (previousState, action) => nextState 26 // Reducer에서 previousState, action을 이용해 nextState로 만들기 때문 :: (previousState, action) => nextState
26 // request를 reducer로 보내는 작업 27 // request를 reducer로 보내는 작업
27 28
...@@ -30,3 +31,14 @@ export function RegisterUser(regInfo) { ...@@ -30,3 +31,14 @@ export function RegisterUser(regInfo) {
30 payload: request // payroad == response 31 payload: request // payroad == response
31 } 32 }
32 } 33 }
34 +
35 +export function auth() {
36 + const request = axios.get('/api/users/auth') // logInfo를 post로 전달
37 + .then(response => response.data); // 서버에서 받은 데이터를 request에 저장
38 +
39 + return {
40 +
41 + type: "AUTH_USER",
42 + payload: request // payroad == response
43 + }
44 +}
...\ No newline at end of file ...\ No newline at end of file
......
1 import { 1 import {
2 LOGIN_USER, 2 LOGIN_USER,
3 - REGISTER_USER 3 + REGISTER_USER,
4 + AUTH_USER
4 } from '../_actions/types'; 5 } from '../_actions/types';
5 6
6 7
...@@ -10,9 +11,15 @@ export default function (prevState = {}, action) { ...@@ -10,9 +11,15 @@ export default function (prevState = {}, action) {
10 case LOGIN_USER: 11 case LOGIN_USER:
11 return {...prevState, loginSuccess:action.payload} // 위의 prevState를 그대로 가져오고, 12 return {...prevState, loginSuccess:action.payload} // 위의 prevState를 그대로 가져오고,
12 // user_action.js에 있는 payload를 그대로 가져와서 return. 13 // user_action.js에 있는 payload를 그대로 가져와서 return.
14 + // loginSuccess는 server/index.js 에서 login에 성공하면 json type으로 loginSuccess: true를 전달하라고 했기 때문
13 break; 15 break;
14 case REGISTER_USER: 16 case REGISTER_USER:
15 return {...prevState, success:action.payload} 17 return {...prevState, success:action.payload}
18 + // success는 server/index.js 에서 register에 성공하면 json type으로 success: true를 전달하라고 했기 때문
19 + break;
20 +
21 + case AUTH_USER:
22 + return {...prevState, user:action.payload}
16 break; 23 break;
17 default: 24 default:
18 return prevState; 25 return prevState;
......
1 +// 사용자의 상태를 보고
2 +// 해당 페이지에 들어갈 수 있게 할지 안할지 결정해 줌. hoc 이용.
3 +import axios from 'axios';
4 +import React, {useEffect} from 'react';
5 +//import {useEffect} from 'react';
6 +import {useDispatch} from 'react-redux';
7 +import {auth} from '../_actions/user_action'
8 +
9 +
10 +export default function (SpecificComponent, option, adminRoute = null){
11 + // ㄴ option 종류
12 + // - null 아무나 출입 가능한 페이지
13 + // - true 로그인한 유저만 출입 가능
14 + // - false 로그인한 유저 출입 불가능
15 +
16 + function AuthenticationCheck(props) {
17 + //1. backend에 request를 날려서 사용자의 상태를 확인
18 + const dispatch = useDispatch(); // 1-1. dispatch 사용
19 + useEffect(() => {
20 + dispatch(auth()) // 페이지가 이동할 때마다 dispatch가 작동해서 backend에 request를 줌
21 + .then(response => { // 받은 response
22 + console.log(response);
23 +
24 +
25 + // 로그인 안했다면
26 + if(!response.payload.isAuth) {
27 + if(option) { // 만약 위 option이 true이면 (로그인한 유저만 출입 가능한 페이지로 가게 하려면)
28 + props.history.push('/login'); // 로그인 하게 함
29 + }
30 + }
31 +
32 + // 로그인 했다면
33 + else {
34 + if(adminRoute && !response.payload.isAdmin) { // admin만 갈 수 있는 페이지를 admin이 false 사람이 들어가려 한다면
35 + props.history.push('/'); // 홈페이지로 돌아가게 함
36 + }
37 + else {
38 + if(option===false) {// 로그인한 유저가 출입 불가능한 곳을 가려고 한다면
39 + props.history.push('/'); // 홈페이지로 돌아가게 함
40 +
41 + }
42 + }
43 + }
44 + })
45 + },[])
46 +
47 + return (
48 + <SpecificComponent />
49 + )
50 +
51 + }
52 +
53 + return AuthenticationCheck
54 +}
...\ No newline at end of file ...\ No newline at end of file