로그인을 올바르게 한 사용자만이 글을 작성 할 수 있고, 그 글에 대한 소유자만이 글을 수정 및 삭제를 할 수 있도록 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 });
}
}
})
}
)
}
});
글 삭제에 대한 부분 또한 글 수정과 같은 방식으로 구현 해 주시면 됩니다.