Files
tk-factory-services/system1-factory/api/utils/access.js
Hyungi Ahn 550633b89d feat: 3-System 분리 프로젝트 초기 코드 작성
TK-FB(공장관리+신고)와 M-Project(부적합관리)를 3개 독립 시스템으로
분리하기 위한 전체 코드 구조 작성.
- SSO 인증 서비스 (bcrypt + pbkdf2 이중 해시 지원)
- System 1: 공장관리 (TK-FB 기반, 신고 코드 제거)
- System 2: 신고 (TK-FB에서 workIssue 코드 추출)
- System 3: 부적합관리 (M-Project 기반)
- Gateway 포털 (path-based 라우팅)
- 통합 docker-compose.yml 및 배포 스크립트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-09 14:40:11 +09:00

178 lines
4.9 KiB
JavaScript

/**
* @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
};