/** * @deprecated 이 파일의 미들웨어 함수들은 하위 호환성을 위해 유지됩니다. * 새로운 코드에서는 '../middlewares/auth'를 사용하세요. */ // utils/access.js - 유틸리티 함수와 레거시 호환성 const ACCESS_LEVELS = { worker: 1, group_leader: 2, support_team: 3, admin: 4, system: 5 }; const ACCESS_LEVEL_NAMES = { worker: '작업자', group_leader: '그룹장', support_team: '지원팀', admin: '관리자', system: '시스템' }; /** * 권한 레벨 비교 (유틸리티 함수) * @param {string} userLevel - 사용자의 권한 레벨 * @param {string} requiredLevel - 필요한 권한 레벨 * @returns {boolean} - 권한 여부 */ const hasPermission = (userLevel, requiredLevel) => { const userOrder = ACCESS_LEVELS[userLevel] || 0; const requiredOrder = ACCESS_LEVELS[requiredLevel] || 999; return userOrder >= requiredOrder; }; /** * 권한 레벨을 숫자로 변환 * @param {string} level - 권한 레벨 문자열 * @returns {number} - 권한 레벨 숫자 */ const getLevelNumber = (level) => { return ACCESS_LEVELS[level] || 0; }; /** * 권한 레벨을 한글명으로 변환 * @param {string} level - 권한 레벨 문자열 * @returns {string} - 한글 권한명 */ const getLevelName = (level) => { return ACCESS_LEVEL_NAMES[level] || '알 수 없음'; }; /** * 사용자가 특정 권한들 중 하나라도 가지고 있는지 확인 * @param {string} userLevel - 사용자의 권한 레벨 * @param {string[]} allowedLevels - 허용된 권한 레벨들 * @returns {boolean} - 권한 여부 */ const hasAnyPermission = (userLevel, allowedLevels) => { return allowedLevels.some(level => hasPermission(userLevel, level)); }; /** * 모든 권한 레벨 목록 반환 * @returns {string[]} - 권한 레벨 배열 */ const getAllLevels = () => { return Object.keys(ACCESS_LEVELS); }; /** * 특정 권한 레벨 이상의 모든 권한 반환 * @param {string} minLevel - 최소 권한 레벨 * @returns {string[]} - 해당 레벨 이상의 권한들 */ const getLevelsAbove = (minLevel) => { const minOrder = ACCESS_LEVELS[minLevel] || 0; return Object.keys(ACCESS_LEVELS).filter(level => ACCESS_LEVELS[level] >= minOrder); }; // ===== 프론트엔드용 권한 체크 함수들 ===== /** * 페이지 접근 권한 체크 (프론트엔드에서 사용) * @param {string} userLevel - 사용자 권한 * @param {object} pageConfig - 페이지 설정 {minLevel?, allowedRoles?, deniedRoles?} * @returns {boolean} - 접근 가능 여부 */ const canAccessPage = (userLevel, pageConfig) => { const { minLevel, allowedRoles, deniedRoles = [] } = pageConfig; // 거부 목록 체크 if (deniedRoles.includes(userLevel)) { return false; } // 허용 목록 체크 if (allowedRoles && allowedRoles.length > 0) { return allowedRoles.includes(userLevel); } // 최소 레벨 체크 if (minLevel) { return hasPermission(userLevel, minLevel); } return true; }; /** * CRUD 권한 체크 (프론트엔드에서 사용) * @param {string} userLevel - 사용자 권한 * @param {string} table - 테이블명 * @param {string} action - 액션 (CREATE, READ, UPDATE, DELETE) * @returns {boolean} - 권한 여부 */ const canPerformAction = (userLevel, table, action) => { // 기본적으로 모든 인증된 사용자에게 권한 부여 // 특별한 제한이 필요한 경우에만 여기서 체크 // 예시: 사용자 관리는 admin 이상만 if (table === 'Users' && ['CREATE', 'UPDATE', 'DELETE'].includes(action)) { return hasPermission(userLevel, 'admin'); } // 예시: 시스템 테이블은 system만 if (table === 'SystemConfig') { return hasPermission(userLevel, 'system'); } // 나머지는 모든 인증된 사용자에게 허용 return userLevel && userLevel !== 'anonymous'; }; // ===== 레거시 호환성: 미들웨어 함수 ===== /** * @deprecated 이 미들웨어는 하위 호환성을 위해 유지됩니다. * 새로운 코드에서는 '../middlewares/auth'의 requireRole을 사용하세요. * * @example * // 이전 방식 (deprecated) * const { requireAccess } = require('../utils/access'); * router.get('/admin', requireAccess('admin'), handler); * * // 새로운 방식 (권장) * const { requireAuth, requireRole } = require('../middlewares/auth'); * router.get('/admin', requireAuth, requireRole('admin'), handler); */ const requireAccess = (...allowed) => { return (req, res, next) => { if (!req.user || !allowed.includes(req.user.access_level)) { return res.status(403).json({ error: '접근 권한이 없습니다' }); } next(); }; }; module.exports = { // 기본 유틸리티 함수들 hasPermission, getLevelNumber, getLevelName, hasAnyPermission, getAllLevels, getLevelsAbove, // 프론트엔드용 함수들 canAccessPage, canPerformAction, // 레거시 호환성 (deprecated) requireAccess, // 상수들 ACCESS_LEVELS, ACCESS_LEVEL_NAMES };