ERP-node/docs/권한_시스템_마이그레이션_완료.md

308 lines
9.9 KiB
Markdown
Raw Permalink Normal View History

2025-10-27 16:40:59 +09:00
# 권한 시스템 마이그레이션 완료 보고서
## 실행 완료 ✅
날짜: 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. 화면 생성 시 자동 메뉴 추가 🤖
```sql
-- 사용자가 화면 생성
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. 화면 삭제 시 자동 메뉴 비활성화 🤖
```sql
-- 화면 삭제
UPDATE screen_definitions
SET is_active = 'D'
WHERE screen_code = 'SCR_CONTRACT';
-- ↓ 트리거 자동 실행 ↓
-- 메뉴 비활성화됨!
UPDATE menu_info
SET status = 'inactive'
WHERE screen_code = 'SCR_CONTRACT';
```
---
## 사용 가이드
### 1. 권한 그룹 생성
```sql
-- 예: 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. 권한 그룹에 멤버 추가
```sql
-- 예: '개발팀'에 사용자 '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. 메뉴 권한 설정
```sql
-- 예: '개발팀'에게 특정 메뉴의 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. 사용자 권한 확인
```sql
-- 예: '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.ts`
- `backend-node/src/controllers/roleController.ts`
- `backend-node/src/middleware/permissionMiddleware.ts`
### 2. 프론트엔드 UI 개발
**필요한 페이지/컴포넌트**:
1. **권한 그룹 상세 페이지** (`/admin/roles/[id]`)
- 기본 정보 (이름, 코드, 회사)
- 멤버 관리 (Dual List Box) ✅ 이미 구현됨
- **메뉴 권한 설정** (체크박스 그리드) ⬅️ 신규 개발 필요
2. **메뉴 권한 설정 그리드**
```
┌─────────────────┬────────┬────────┬────────┬────────┬────────┬────────┐
│ 메뉴 │ 생성 │ 읽기 │ 수정 │ 삭제 │ 실행 │ 내보내기│
├─────────────────┼────────┼────────┼────────┼────────┼────────┼────────┤
│ 대시보드 │ ☐ │ ☑ │ ☐ │ ☐ │ ☐ │ ☐ │
│ 계약 관리 │ ☑ │ ☑ │ ☑ │ ☐ │ ☐ │ ☑ │
│ 사용자 관리 │ ☐ │ ☑ │ ☐ │ ☐ │ ☐ │ ☐ │
└─────────────────┴────────┴────────┴────────┴────────┴────────┴────────┘
```
3. **네비게이션 메뉴** (사용자별 권한 필터링)
- `get_user_menus_with_permissions` 함수 활용
- 읽기 권한이 있는 메뉴만 표시
4. **버튼/액션 권한 제어**
- 생성 버튼: `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: 영업팀 권한 설정**
1. 영업팀 권한 그룹 생성
2. 멤버 추가 (3명)
3. 메뉴 권한 설정:
- 대시보드: 읽기만
- 계약 관리: CRUD + 내보내기
- 플로우 관리: 읽기 + 실행
4. 영업팀 사용자로 로그인하여 검증
**시나리오 2: 동적 화면 생성 및 권한 설정**
1. "배송 현황" 화면 생성
2. 자동으로 메뉴 추가 확인
3. 영업팀에게 읽기 권한 부여
4. 영업팀 사용자 로그인하여 메뉴 표시 확인
---
## 주의사항
### 1. 기존 데이터 호환성
- 기존 `menu_info` 테이블 구조는 그대로 유지
- 새로운 컬럼만 추가되어 기존 데이터에 영향 없음
### 2. 권한 타입 매핑
- `menu_type``numeric`에서 `VARCHAR`로 변경되지 않음 (기존 구조 유지)
- `menu_type = 2`가 동적 생성 메뉴를 의미
### 3. 데이터 마이그레이션 불필요
- 기존 권한 데이터는 그대로 유지
- 새로운 권한 그룹은 수동으로 설정 필요
---
## 검증 체크리스트
- [x] `authority_master.company_code` 컬럼 존재 확인
- [x] `menu_info.screen_code`, `menu_info.menu_code` 컬럼 존재 확인
- [x] `rel_menu_auth.execute_yn`, `rel_menu_auth.export_yn` 컬럼 존재 확인
- [x] 트리거 함수 생성 확인 (`auto_create_menu_for_screen`, `auto_deactivate_menu_for_screen`)
- [x] 권한 체크 함수 생성 확인 (`check_menu_crud_permission`)
- [x] 사용자 메뉴 조회 함수 생성 확인 (`get_user_menus_with_permissions`)
- [x] 권한 요약 뷰 생성 확인 (`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` - 메뉴 권한 마이그레이션
---
## 문의사항
기술적 문의사항이나 추가 기능 요청은 개발팀에 문의하세요.