Showing
35 changed files
with
92 additions
and
24 deletions
File moved
No preview for this file type
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; | ... | ... |
We-Shop/client/src/hoc/authentication.js
0 → 100644
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 |
-
Please register or login to post a comment