feat: 초기 프로젝트 설정 및 룰.md 파일 추가
This commit is contained in:
9
api.hyungi.net/middlewares/access.js
Normal file
9
api.hyungi.net/middlewares/access.js
Normal file
@@ -0,0 +1,9 @@
|
||||
// utils/access.js
|
||||
exports.requireAccess = (...allowed) => {
|
||||
return (req, res, next) => {
|
||||
if (!req.user || !allowed.includes(req.user.access_level)) {
|
||||
return res.status(403).json({ error: '접근 권한이 없습니다' });
|
||||
}
|
||||
next();
|
||||
};
|
||||
};
|
||||
33
api.hyungi.net/middlewares/accessMiddleware.js
Normal file
33
api.hyungi.net/middlewares/accessMiddleware.js
Normal file
@@ -0,0 +1,33 @@
|
||||
// middlewares/accessMiddleware.js
|
||||
|
||||
// 권한 레벨 정의
|
||||
const ACCESS_LEVELS = {
|
||||
worker: 1,
|
||||
group_leader: 2,
|
||||
support_team: 3,
|
||||
admin: 4,
|
||||
system: 5
|
||||
};
|
||||
|
||||
const requireAccess = (requiredLevel) => {
|
||||
return (req, res, next) => {
|
||||
if (!req.user) {
|
||||
return res.status(401).json({ error: '인증이 필요합니다.' });
|
||||
}
|
||||
|
||||
const userLevel = ACCESS_LEVELS[req.user.access_level] || 0;
|
||||
const required = ACCESS_LEVELS[requiredLevel] || 999;
|
||||
|
||||
if (userLevel < required) {
|
||||
return res.status(403).json({
|
||||
error: '접근 권한이 없습니다.',
|
||||
required: requiredLevel,
|
||||
current: req.user.access_level
|
||||
});
|
||||
}
|
||||
|
||||
next();
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = { requireAccess, ACCESS_LEVELS };
|
||||
20
api.hyungi.net/middlewares/auth.js
Normal file
20
api.hyungi.net/middlewares/auth.js
Normal file
@@ -0,0 +1,20 @@
|
||||
// 📁 middlewares/auth.js
|
||||
const jwt = require('jsonwebtoken');
|
||||
require('dotenv').config();
|
||||
|
||||
module.exports = (req, res, next) => {
|
||||
const authHeader = req.headers['authorization'];
|
||||
const token = authHeader?.split(' ')[1];
|
||||
|
||||
if (!token) {
|
||||
return res.status(401).json({ message: 'Access token required' });
|
||||
}
|
||||
|
||||
try {
|
||||
const decoded = jwt.verify(token, process.env.JWT_SECRET);
|
||||
req.user = decoded; // 다른 미들웨어에서 사용할 수 있게 설정
|
||||
next();
|
||||
} catch (err) {
|
||||
return res.status(403).json({ message: 'Invalid token' });
|
||||
}
|
||||
};
|
||||
22
api.hyungi.net/middlewares/authMiddleware.js
Normal file
22
api.hyungi.net/middlewares/authMiddleware.js
Normal file
@@ -0,0 +1,22 @@
|
||||
const jwt = require('jsonwebtoken');
|
||||
|
||||
exports.verifyToken = (req, res, next) => {
|
||||
try {
|
||||
const authHeader = req.headers['authorization'];
|
||||
if (!authHeader) {
|
||||
return res.status(401).json({ error: '토큰 없음' });
|
||||
}
|
||||
|
||||
const token = authHeader.split(' ')[1];
|
||||
if (!token) {
|
||||
return res.status(401).json({ error: '토큰 누락' });
|
||||
}
|
||||
|
||||
const decoded = jwt.verify(token, process.env.JWT_SECRET);
|
||||
req.user = decoded;
|
||||
next(); // ✅ 반드시 next 호출
|
||||
} catch (err) {
|
||||
console.error('[verifyToken 오류]', err.message);
|
||||
return res.status(403).json({ error: '토큰 검증 실패', detail: err.message });
|
||||
}
|
||||
};
|
||||
16
api.hyungi.net/middlewares/errorHandler.js
Normal file
16
api.hyungi.net/middlewares/errorHandler.js
Normal file
@@ -0,0 +1,16 @@
|
||||
// middlewares/errorHandler.js
|
||||
exports.errorHandler = (err, req, res, next) => {
|
||||
console.error('Error:', err);
|
||||
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
res.status(500).json({
|
||||
error: '서버 오류가 발생했습니다.',
|
||||
details: err.message,
|
||||
stack: err.stack
|
||||
});
|
||||
} else {
|
||||
res.status(500).json({
|
||||
error: '서버 오류가 발생했습니다.'
|
||||
});
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user