The Web Developer - (Udemy)_ YelpCamp: 기본 권한 부여

‍정진철·2022년 8월 23일
0

web devloper (udemy)

목록 보기
27/34

1) 캠프그라운드에 Author 추가하기

캠프그라운드 스키마에 'author' 프로퍼티 추가

데이터베이스에 저장시 author 항목 추가

새로운 캠핑장 생성시 추가한 유저의 이름 뜨게 만들기.

  • campground.author = req.user_id;

show.ejs에 유저네임 작성


2) 편집/삭제 표시 및 숨기기

  • 현재 'A'란 사람이 'B'가 만든 데이터를 삭제가 가능.
  • 이것을 막아보기 위한 코드 작성. (권한 부여)
  • 로그인한 유저와 != 캠핑장 생성한 유저
    -> DELETE, EDIT 버튼 보이지 않음. (equals)


3) 캠프그라운드 허가

다른 사용자가 생성한 캠핑장을 업데이트 하기 위해 Postman이나 Ajax로 요청을 보낼 수 있는 put,delete 라우트 사용 못하게 하기.

  • 해당 유저를 찾고 (find) , 업데이트 가능한 자격인지 확인하고 (update) 즉 2단계에 걸쳐 진행.

  • DELETE,EDIT의 행위를 취하려는 유저의 id가 캠핑장을 애초에 추가한 유저의 아이디와 동일한지 확인. (equals)


4) 권한을 부여 받은 미들웨어

미들웨어 파일에 정리하기


<middleware.js>

const { campgroundSchema, reviewSchema } = require('./schemas.js') 
const ExpressError = require('./utils/ExpressError')
const Campground = require('./models/campground') 

module.exports.validateCampground = (req, res, next) => {
   const { error } = campgroundSchema.validate(req.body);
   if (error) {
       const msg = error.details.map(el => el.message).join(',')
       throw new ExpressError(msg, 400)
   } else {
       next();
   }


   module.exports.isAuthor = async(req,res,next) => {
       const { id } = req.params;
       const campground = await Campground.findById(id)
       if(!campground.author.equals(req.user._id)) {
           req.flash('error', 'You dont have have permission to do that !')
          return  res.redirect(`/campgrounds/${id}`)
       } next();
     }
   }


module.exports.isLoggedIn = (req, res, next) => {
   if (!req.isAuthenticated()) {
       req.session.returnTo = req.originalUrl
       req.flash('error', 'You must be signed in first!');
       return res.redirect('/login');
   }
   next();
}


module.exports.validateReview = (req, res, next) => {
   const { error } = reviewSchema.validate(req.body);
   if (error) {
       const msg = error.details.map(el => el.message).join(',')
       throw new ExpressError(msg, 400)
   } else {
       next();
   }
}
<campgrounds.js>

const { isLoggedIn, isAuthor,validateCampground } = require('../middleware');
  • 적용시키기


5) 허가 리뷰

리뷰스키마에 author 프로퍼티 추가.


  • show.ejs에 유저가 로그인에 성공하는 경우만 리뷰를 작성하게끔 한다.


  • isLoggedIn 미들웨어를 통해 리뷰 작성 시도 시 로그인 여부 체크
  • review.author = req.user._id를 통해 로그인 한 유저의 해쉬처리된 아이디를 review스키마의 author 프로퍼티에 저장시켜 db 조회시 해당 유저의 해쉬처리된 아이디를 조회할 수 있다.

6) 권한 리뷰 더 알아보기

매 새로운 리뷰를 제각기 다른 유저가 작성시 리뷰를 작성한 유저 네임 출력하기.

  • populate 안에 경로를 지정 (path) 해줘서 매 새로운 리뷰마다 author 가 뜨게 만들도록 한다.


  • show.ejs 에서 현재 유저가 로그인 중이고 로그인한 아이디의 해쉬아이디와 author의 아이디가 동일할 때 에만 DELETE 행위를 할 수 있도록 한다.

  • 미들웨어로서 isReviewAuthor 추가
    -> 리뷰 작성자만 삭제가능하도록 하는 미들웨어

  • delete 라우터에 미들웨어 추가하기


  • 참고로 밑에처럼 미들웨어 코드 생성시 해당 모델을 먼저 소환해주고 코드를 짜야 한다.


profile
WILL is ALL

0개의 댓글