Protector and Public Middlewares

0_CyberLover_0·2022년 4월 25일
0

Node.JS #05

목록 보기
10/19

현재 원하는건 로그인 하지 않은 사람들이 해당 페이지에 가는걸 막는 일이다.

그걸 위해서 Protector Middlewares 를 만드는 거다.

middlewares.js에서

export const proectorMiddleware = (req, res, next) => {
 if (req.session.loggedIn) {
   return next();
 } else {
   return res.redirect("/login");
 }
};

export const publicOnlyMiddleware = (req, res, next) => {
 if (!req.session.loggedIn) {
   return next();
 } else {
   return res.redirect("/");
 }
};

middleware뿐만 아니라 모든 것에 req,res,next가 포함되어 있다는 걸 명심한다.

그리고 사용자가 로그인 돼 있지 않은걸 확인하면 로그인 페이지로 redirect하게 할거다.

사용자가 로그인 돼 있다면 request를 계속 하도록 하는 거다.

controller에서 user를 찾게 하는 방법은 req.session.loggedIn이다.

어느 controllermiddleware에서도 사용 할수 있다.

userloggedIn이 되어 있으면 next()함수를 호출 하는거다.

그리고 유저가 loggedIn이 아니라면 로그인 페이지로 redirect하게 된다.

그 다음 로그인 돼 있지 않은 사람들만 접근 할수 있게 하는 middleware도 만든다.

예를 들어 로그인했는데 다시 로그인 페이지로 갈수 있으면 안되는 거다.

방금 전이랑 반대로 만들어 준다.

그리고 loggedIn이 돼 있다면 /res.redirect로 해준다.

현재 middleware에서는 userloggedIn돼 있다면 요청을 계속 하게 하고

loggedIn돼 있지 않으면 로그인 페이지로 redirect해준다.

다른 middlewareuserloggedIn돼 있지 않으면 요청을 계속하게 하고

loggedIn돼 있으면 "/"으로 redirect해준다.

그러면 이 middleware들을 사용해 보도록 한다.

userRouter.js에서

userRouter.get("/logout", protectorMiddleware, logout);
userRouter
  .route("/edit")
  .get(protectorMiddleware, getEdit)
  .post(protectorMiddleware, postEdit);

로그인 돼 있는 사람들만 로그아웃 페이지로 갈수 있어야 한다.

그래서 protectorMiddleware를 추가 할거다.

/edit 에도 protectorMiddleware를 적용해 준다.

middlewareget이랑 post 둘 다 사용 할수 있게 되었다.

하지만 express에서는 반복해서 사용 할 필요 없이 all()이라는 함수를 사용 하면 된다.

userRouter.route("/edit").all(protectorMiddleware).get(getEdit).post(postEdit);

이렇게 해주면 get,post 등 어떤 http method를 사용 하든지 middleware를 사용 한다는 거다.

이제 startGithubLogin,finishGithubLogin을 싫행시키고 싶다면

publicOnlyMiddleware를 적용하면 된다.

publicOnly는 로그아웃 돼 있어야 실행시키는걸 허락해주니까

로그인 돼 있으면 여기로 올수 없게 보호해주는 거다.

userRouter.get("/github/start", publicOnlyMiddleware, startGithubLogin);
userRouter.get("/github/finish", publicOnlyMiddleware, finishGithubLogin);

그리고 이건 나중에 user를 볼수 있게 해줄거다.

userRouter.get(":id", see);

이건 public도 될수 있고 private도 될수 있을것 같다. 로그인 여부가 상관없는 거다.

그리고 import도 해준다.

import { protectorMiddleware, publicOnlyMiddleware } from "../middlewares";

그리고 이제 새로고침을 해보면 잘 작동 한다.

로그인 된 상태에서 로그인 페이지로 갈수가 있다 이것도 보호 해주도록 한다.

그리고 /github/start로 가본다. 홈페이로 돌아가진다. 잘 작동한다.

rootRouer.js에 가서

rootRouter.route("/join").all(publicOnlyMiddleware).get(getJoin).post(postJoin);
rootRouter
  .route("/login")
  .all(publicOnlyMiddleware)
  .get(getLogin)
  .post(postLogin);

/join,/login에는 로그아웃 된 사람만 갈수 있다.

그래서 두곳에 all()함수를 적용 해주었다. 새로고침 해보니 로그인 상태에서 로그인 페이지로 갈수 없다.

당연히 join페이지도 못 간다.

profile
꿈꾸는 개발자

0개의 댓글