getDb()가 async(Promise 반환)인데 await 없이 호출하여 non-admin 사용자 API 호출 시 db.query is not a function 에러 발생. admin은 L18에서 조기 리턴하여 영향 없었음. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
62 lines
2.2 KiB
JavaScript
62 lines
2.2 KiB
JavaScript
/**
|
|
* 페이지 권한 미들웨어 (shared)
|
|
* admin/system 역할은 자동 통과, 일반 사용자는 개인/부서 권한 체크
|
|
*
|
|
* 사용법:
|
|
* const { createRequirePage } = require('../../shared/middleware/pagePermission');
|
|
* const requirePage = createRequirePage(() => getPool());
|
|
* router.get('/some', requirePage('page_name'), controller.handler);
|
|
*/
|
|
|
|
function createRequirePage(getPool) {
|
|
return function requirePage(pageName) {
|
|
return async (req, res, next) => {
|
|
const userId = req.user.user_id || req.user.id;
|
|
const role = (req.user.role || '').toLowerCase();
|
|
|
|
// admin/system 자동 통과
|
|
if (role === 'admin' || role === 'system') return next();
|
|
|
|
try {
|
|
const db = typeof getPool === 'function' ? await getPool() : getPool;
|
|
|
|
// 1. 개인 권한 체크
|
|
const [rows] = await db.query(
|
|
'SELECT can_access FROM user_page_permissions WHERE user_id = ? AND page_name = ?',
|
|
[userId, pageName]
|
|
);
|
|
if (rows.length > 0) {
|
|
return rows[0].can_access
|
|
? next()
|
|
: res.status(403).json({ success: false, error: '접근 권한이 없습니다' });
|
|
}
|
|
|
|
// 2. 부서 권한 체크
|
|
const [userRows] = await db.query(
|
|
'SELECT department_id FROM sso_users WHERE user_id = ?',
|
|
[userId]
|
|
);
|
|
if (userRows.length > 0 && userRows[0].department_id) {
|
|
const [deptRows] = await db.query(
|
|
'SELECT can_access FROM department_page_permissions WHERE department_id = ? AND page_name = ?',
|
|
[userRows[0].department_id, pageName]
|
|
);
|
|
if (deptRows.length > 0) {
|
|
return deptRows[0].can_access
|
|
? next()
|
|
: res.status(403).json({ success: false, error: '접근 권한이 없습니다' });
|
|
}
|
|
}
|
|
|
|
// 3. 권한 레코드 없음 → 거부
|
|
return res.status(403).json({ success: false, error: '접근 권한이 없습니다' });
|
|
} catch (err) {
|
|
console.error('Permission check error:', err);
|
|
return res.status(500).json({ success: false, error: '권한 확인 실패' });
|
|
}
|
|
};
|
|
};
|
|
}
|
|
|
|
module.exports = { createRequirePage };
|