9.9 KiB
9.9 KiB
권한 시스템 마이그레이션 완료 보고서
실행 완료 ✅
날짜: 2025-10-27
대상 데이터베이스: plm (39.117.244.52:11132)
실행된 마이그레이션
1. 028_add_company_code_to_authority_master.sql ✅
목적: 권한 그룹 시스템 개선 (회사별 격리)
주요 변경사항:
authority_master.company_code컬럼 추가 (회사별 권한 그룹 격리)- 외래 키 제약 조건 추가 (
authority_sub_user↔authority_master,user_info) - 권한 요약 뷰 생성 (
v_authority_group_summary) - 유틸리티 함수 생성 (
get_user_authority_groups)
2. 031_add_menu_auth_columns.sql ✅
목적: 메뉴 기반 권한 시스템 개선 (동적 화면 대응)
주요 변경사항:
menu_info.screen_code,menu_info.menu_code컬럼 추가rel_menu_auth.execute_yn,rel_menu_auth.export_yn컬럼 추가- 화면 생성 시 자동 메뉴 추가 트리거 (
auto_create_menu_for_screen) - 화면 삭제 시 자동 메뉴 비활성화 트리거 (
auto_deactivate_menu_for_screen) - 권한 체크 함수 (
check_menu_crud_permission) - 사용자 메뉴 조회 함수 (
get_user_menus_with_permissions) - 권한 요약 뷰 (
v_menu_permission_summary)
현재 데이터베이스 구조
1. 권한 그룹 시스템
authority_master (권한 그룹)
objid | NUMERIC | 권한 그룹 ID (PK)
auth_name | VARCHAR(50) | 권한 그룹 이름
auth_code | VARCHAR(50) | 권한 그룹 코드
company_code | VARCHAR(20) | 회사 코드 ⭐ (회사별 격리)
status | VARCHAR(20) | 활성/비활성
authority_sub_user (권한 그룹 멤버)
master_objid | NUMERIC | 권한 그룹 ID (FK)
user_id | VARCHAR(50) | 사용자 ID (FK)
현재 권한 그룹 현황
- COMPANY_1: 2개 그룹
- COMPANY_2: 2개 그룹
- COMPANY_3: 7개 그룹
- COMPANY_4: 2개 그룹
- ILSHIN: 3개 그룹
2. 메뉴 권한 시스템
menu_info (메뉴 정보)
objid | NUMERIC | 메뉴 ID (PK)
menu_name_kor | VARCHAR(64) | 메뉴 이름 (한글)
menu_name_eng | VARCHAR(64) | 메뉴 이름 (영어)
menu_code | VARCHAR(50) | 메뉴 코드 ⭐ (신규)
menu_url | VARCHAR(256) | 메뉴 URL
menu_type | NUMERIC | 메뉴 타입 (0=일반, 1=시스템, 2=동적생성 ⭐)
screen_code | VARCHAR(50) | 화면 코드 ⭐ (동적 메뉴 연동)
company_code | VARCHAR(50) | 회사 코드
parent_obj_id | NUMERIC | 부모 메뉴 ID
seq | NUMERIC | 정렬 순서
status | VARCHAR(32) | 상태
rel_menu_auth (메뉴별 권한)
menu_objid | NUMERIC | 메뉴 ID (FK)
auth_objid | NUMERIC | 권한 그룹 ID (FK)
create_yn | VARCHAR(50) | 생성 권한
read_yn | VARCHAR(50) | 읽기 권한
update_yn | VARCHAR(50) | 수정 권한
delete_yn | VARCHAR(50) | 삭제 권한
execute_yn | CHAR(1) | 실행 권한 ⭐ (신규)
export_yn | CHAR(1) | 내보내기 권한 ⭐ (신규)
자동화 기능
1. 화면 생성 시 자동 메뉴 추가 🤖
-- 사용자가 화면 생성
INSERT INTO screen_definitions (screen_name, screen_code, company_code, ...)
VALUES ('계약 관리', 'SCR_CONTRACT', 'ILSHIN', ...);
-- ↓ 트리거 자동 실행 ↓
-- menu_info에 자동 추가됨!
-- menu_type = 2 (동적 생성)
-- screen_code = 'SCR_CONTRACT'
-- menu_url = '/screen/SCR_CONTRACT'
2. 화면 삭제 시 자동 메뉴 비활성화 🤖
-- 화면 삭제
UPDATE screen_definitions
SET is_active = 'D'
WHERE screen_code = 'SCR_CONTRACT';
-- ↓ 트리거 자동 실행 ↓
-- 메뉴 비활성화됨!
UPDATE menu_info
SET status = 'inactive'
WHERE screen_code = 'SCR_CONTRACT';
사용 가이드
1. 권한 그룹 생성
-- 예: ILSHIN 회사의 "개발팀" 권한 그룹 생성
INSERT INTO authority_master (objid, auth_name, auth_code, company_code, status, writer, regdate)
VALUES (nextval('seq_authority_master'), '개발팀', 'DEV_TEAM', 'ILSHIN', 'active', 'admin', NOW());
2. 권한 그룹에 멤버 추가
-- 예: '개발팀'에 사용자 'dev1' 추가
INSERT INTO authority_sub_user (master_objid, user_id)
VALUES (
(SELECT objid FROM authority_master WHERE auth_code = 'DEV_TEAM' AND company_code = 'ILSHIN'),
'dev1'
);
3. 메뉴 권한 설정
-- 예: '개발팀'에게 특정 메뉴의 CRUD 권한 부여
INSERT INTO rel_menu_auth (menu_objid, auth_objid, create_yn, read_yn, update_yn, delete_yn, execute_yn, export_yn, writer)
VALUES (
1005, -- 메뉴 ID
(SELECT objid FROM authority_master WHERE auth_code = 'DEV_TEAM' AND company_code = 'ILSHIN'),
'Y', 'Y', 'Y', 'Y', 'Y', 'N', -- CRUD + Execute 권한
'admin'
);
4. 사용자 권한 확인
-- 예: 'dev1' 사용자가 메뉴 1005를 수정할 수 있는지 확인
SELECT check_menu_crud_permission('dev1', 1005, 'update');
-- 결과: TRUE 또는 FALSE
-- 예: 'dev1' 사용자가 접근 가능한 모든 메뉴 조회
SELECT * FROM get_user_menus_with_permissions('dev1', 'ILSHIN');
다음 단계
1. 백엔드 API 구현
필요한 API:
GET /api/roles/:id/menu-permissions- 권한 그룹의 메뉴 권한 조회POST /api/roles/:id/menu-permissions- 메뉴 권한 설정GET /api/users/menus- 현재 사용자가 접근 가능한 메뉴 목록POST /api/menu-permissions/check- 특정 메뉴에 대한 권한 확인
구현 파일:
backend-node/src/services/RoleService.tsbackend-node/src/controllers/roleController.tsbackend-node/src/middleware/permissionMiddleware.ts
2. 프론트엔드 UI 개발
필요한 페이지/컴포넌트:
-
권한 그룹 상세 페이지 (
/admin/roles/[id])- 기본 정보 (이름, 코드, 회사)
- 멤버 관리 (Dual List Box) ✅ 이미 구현됨
- 메뉴 권한 설정 (체크박스 그리드) ⬅️ 신규 개발 필요
-
메뉴 권한 설정 그리드
┌─────────────────┬────────┬────────┬────────┬────────┬────────┬────────┐ │ 메뉴 │ 생성 │ 읽기 │ 수정 │ 삭제 │ 실행 │ 내보내기│ ├─────────────────┼────────┼────────┼────────┼────────┼────────┼────────┤ │ 대시보드 │ ☐ │ ☑ │ ☐ │ ☐ │ ☐ │ ☐ │ │ 계약 관리 │ ☑ │ ☑ │ ☑ │ ☐ │ ☐ │ ☑ │ │ 사용자 관리 │ ☐ │ ☑ │ ☐ │ ☐ │ ☐ │ ☐ │ └─────────────────┴────────┴────────┴────────┴────────┴────────┴────────┘ -
네비게이션 메뉴 (사용자별 권한 필터링)
get_user_menus_with_permissions함수 활용- 읽기 권한이 있는 메뉴만 표시
-
버튼/액션 권한 제어
- 생성 버튼:
can_create - 수정 버튼:
can_update - 삭제 버튼:
can_delete - 실행 버튼:
can_execute(플로우, DDL) - 내보내기 버튼:
can_export
- 생성 버튼:
구현 파일:
frontend/components/admin/RoleDetailManagement.tsx(메뉴 권한 탭 추가)frontend/components/admin/MenuPermissionGrid.tsx(신규)frontend/lib/api/role.ts(메뉴 권한 API 추가)frontend/hooks/useMenuPermission.ts(신규)
3. 테스트 시나리오
시나리오 1: 영업팀 권한 설정
- 영업팀 권한 그룹 생성
- 멤버 추가 (3명)
- 메뉴 권한 설정:
- 대시보드: 읽기만
- 계약 관리: CRUD + 내보내기
- 플로우 관리: 읽기 + 실행
- 영업팀 사용자로 로그인하여 검증
시나리오 2: 동적 화면 생성 및 권한 설정
- "배송 현황" 화면 생성
- 자동으로 메뉴 추가 확인
- 영업팀에게 읽기 권한 부여
- 영업팀 사용자 로그인하여 메뉴 표시 확인
주의사항
1. 기존 데이터 호환성
- 기존
menu_info테이블 구조는 그대로 유지 - 새로운 컬럼만 추가되어 기존 데이터에 영향 없음
2. 권한 타입 매핑
menu_type이numeric에서VARCHAR로 변경되지 않음 (기존 구조 유지)menu_type = 2가 동적 생성 메뉴를 의미
3. 데이터 마이그레이션 불필요
- 기존 권한 데이터는 그대로 유지
- 새로운 권한 그룹은 수동으로 설정 필요
검증 체크리스트
authority_master.company_code컬럼 존재 확인menu_info.screen_code,menu_info.menu_code컬럼 존재 확인rel_menu_auth.execute_yn,rel_menu_auth.export_yn컬럼 존재 확인- 트리거 함수 생성 확인 (
auto_create_menu_for_screen,auto_deactivate_menu_for_screen) - 권한 체크 함수 생성 확인 (
check_menu_crud_permission) - 사용자 메뉴 조회 함수 생성 확인 (
get_user_menus_with_permissions) - 권한 요약 뷰 생성 확인 (
v_menu_permission_summary) - 백엔드 API 구현
- 프론트엔드 UI 구현
- 테스트 시나리오 실행
관련 문서
docs/메뉴_기반_권한_시스템_가이드.md- 사용자 가이드docs/권한_체계_가이드.md- 3단계 권한 체계 개요db/migrations/028_add_company_code_to_authority_master.sql- 권한 그룹 마이그레이션db/migrations/031_add_menu_auth_columns.sql- 메뉴 권한 마이그레이션
문의사항
기술적 문의사항이나 추가 기능 요청은 개발팀에 문의하세요.