로그인을 올바르게 한 사용자만이 글을 작성 할 수 있고, 그 글에 대한 소유자만이 글을 수정 및 삭제를 할 수 있도록 Node-Express와 MySQL을 활용하여 구현 해 보도록 합시다.

user 확인 모듈 생성

저는 auth.js라는 파일을 만들어서 request 객체에 user라는 값이 담겼는지 확인하는 isOwner메소드와 로그인 유저와 글 생성 저자가 같은지 판단하는 sameOwner메소드가 담긴 모듈을 만들었습니다.

module.exports = {
    isOwner: function (request, response) { // 유저가 로그인 한 상태인지 판단
        if (request.user) {
            console.log('[isOwner] Logged in')
            return true;
        } else {
            console.log('[isOwner] No user')
            return false;
        }
    },
    sameOwner: function (request, author) { // 로그인 유저와 글 저자가 같은지 판단
        if (request.user.username === author) {
            console.log("[sameOwner] Right approach")
            return 1;
        } else {
            console.log("[sameOwner] Cheating")
            return 0;
        }
    }
}
var auth = require('../lib/auth');

글 작성

첫 번째는 로그인 한 유저가 '글 작성' 버튼을 눌렀을 때 글 작성 페이지로 이동하는 코드입니다. 로그인하지 않은 사용자가 글 작성 버튼을 누르면 anonymous 파일을 렌더 해 줘서 로그인 한 사용자만이 글을 작성 할 수 있도록 합니다.

router.get('/create', function (req, res, next) {
  if (!auth.isOwner(req, res)) {
    res.render('anonymous', { request: req });
  }
  else {
    res.render('create', { request: req });
  }
});

작성한 글을 post방식으로 받는 부분의 코드 또한 위와 같은 방식으로 구현 해 주시면 됩니다.

글 수정

글 수정 파트에서는 sameOwner 메소드가 필요합니다. 글을 작성했던 작성자만이 자신의 글을 수정 할 수 있도록 해야합니다. 다른 사용자가 글을 수정하려고 접근하면 cheat 파일을 렌더 해 줘서 올바르지 않은 접근을 차단하였습니다.

router.get('/update/:id', function (req, res, next) {
  if (!auth.isOwner(req, res)) {
    res.render('anonymous', { request: req });
  }
  else {
    db.query(
      `SELECT * FROM tbl_board`,
      function (error, results) {
        if (error) throw error;
        db.query(
          `SELECT * FROM tbl_board WHERE id=?`,
          [req.params.id],
          function (error2, result) {
            if (error2) throw error2;
            else {
              if (auth.sameOwner(req, result[0].author) === 0) { // 다른 사용자의 잘못된 접근
                res.render('cheat', { request: req });
              }
              else { // 올바른 사용자의 접근
                res.render('update', { post: result[0], request: req });
              }
            }
          })
      }
    )
  }
});

글 삭제에 대한 부분 또한 글 수정과 같은 방식으로 구현 해 주시면 됩니다.