febfb2cbe8
feat: Phase 5 - 권한 관리 UI 고도화 (트리 RBAC PermissionsPanel)
...
버그 수정:
- AccessControl 무한 새로고침 (loadRoles의 userStats 의존성 → setUserStats 호출 → 무한 루프)
loadRoles에서 항상 fetchUserStats를 같이 호출하도록 변경
백엔드 API 추가:
- RoleManagementService (역할/권한 매트릭스 CRUD)
- createRole / updateRole / deleteRole (built-in 보호)
- updatePermissions (Y/N upsert + null 시 명시 권한 제거)
- assignUserRoles (전체 교체 방식, 권한 캐시 evict)
- 모든 액션에 @Auditable 자동 기록
- PermTreeController 확장:
- POST /api/roles (admin:role-management:CREATE)
- PUT /api/roles/{sn} (admin:role-management:UPDATE)
- DELETE /api/roles/{sn} (admin:role-management:DELETE)
- PUT /api/roles/{sn}/permissions (admin:permission-management:UPDATE)
- PUT /api/admin/users/{id}/roles (admin:user-management:UPDATE)
- DTO: RoleCreateRequest, RoleUpdateRequest, PermissionUpdateRequest, UserRoleAssignRequest
- GlobalExceptionHandler:
- IllegalArgumentException → 400 BAD_REQUEST
- IllegalStateException → 409 CONFLICT
- AccessDeniedException → 403 FORBIDDEN
프론트엔드:
- lib/permission/permResolver.ts (TypeScript 미러)
- resolveSingleRoleEffective: 백엔드 PermResolver와 동일 알고리즘
- 4가지 셀 상태 계산 (explicit-granted/inherited-granted/explicit-denied/forced-denied)
- PermissionsPanel.tsx (트리 + R/C/U/D/E 매트릭스)
- 좌측: 역할 목록 + 신규 생성 + 삭제 (built-in 보호)
- 우측: 트리 표 + 셀 클릭 (Y → N → 미지정 순환)
- 부모 READ 게이팅 시각화 (강제 거부 회색 비활성)
- 변경된 셀만 일괄 저장 (dirty 추적)
- UserRoleAssignDialog.tsx
- 사용자에게 역할 다중 선택 배정 (체크박스)
- adminApi.ts 확장: createRole/updateRole/deleteRole/updateRolePermissions/assignUserRoles
- AccessControl.tsx 갱신:
- 역할 관리 탭 → PermissionsPanel 통합
- 사용자 관리 탭 → 역할 배정 버튼 추가 (UserCog 아이콘)
검증:
- 역할 생성 → TESTROLE 6번으로 추가
- 권한 매트릭스 갱신 → dashboard/monitoring READ 부여 (changed: 2)
- 역할 삭제 → built-in이 아니면 OK
- built-in ADMIN 삭제 시도 → 400 BAD_REQUEST (BUILTIN_ROLE_CANNOT_DELETE)
- viewer에게 OPERATOR + ANALYST 다중 배정 → roles=[OPERATOR, ANALYST]
→ 재로그인 시 detection READ 등 자동 상속 확인
- 권한 캐시 evictAllPermissions 즉시 반영
- 프론트 빌드 통과 (533ms)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 10:11:27 +09:00
bae2f33b86
feat: Phase 4 - 모선 워크플로우 + 관리자 화면 + 권한 라우트 가드
...
Phase 4-1: 운영자 워크플로우 백엔드 (자체 DB)
- ParentResolution / ParentReviewLog / CandidateExclusion / LabelSession 엔티티
- Repository 4종 + DTO 5종
- ParentInferenceWorkflowService (HYBRID 패턴):
- review (CONFIRM/REJECT/RESET) - parent-inference-workflow:parent-review (UPDATE)
- excludeForGroup - parent-inference-workflow:parent-exclusion (CREATE)
- excludeGlobal - parent-inference-workflow:exclusion-management (CREATE) [admin]
- releaseExclusion (UPDATE)
- createLabelSession / cancelLabelSession (CREATE/UPDATE)
- ParentInferenceWorkflowController: @RequirePermission으로 권한 강제
- 모든 액션에 @Auditable AOP → audit_log + review_log 동시 기록
Phase 4-2: PermTreeController + AdminLogController
- GET /api/perm-tree (모든 사용자) - 메뉴/사이드바 구성용
- GET /api/roles (admin:role-management) - 역할+권한 매트릭스
- GET /api/admin/audit-logs / access-logs / login-history
Phase 4-3: iran 백엔드 프록시 (stub)
- IranBackendClient: RestClient 기반, 호출 실패 시 null 반환 (graceful)
- VesselAnalysisProxyController: serviceAvailable=false 응답
- PredictionProxyController: DISCONNECTED 응답
- Phase 5에서 iran 백엔드 실 연결 시 코드 변경 최소
Phase 4-4: 프론트엔드 services
- parentInferenceApi.ts: 모선 워크플로우 22개 함수
- adminApi.ts: 감사로그/접근이력/로그인이력/권한트리/역할 조회
Phase 4-5: 사이드바 권한 필터링 + ProtectedRoute 권한 가드
- AuthContext.PATH_TO_RESOURCE에 신규 경로 매핑 추가
- ProtectedRoute에 resource/operation prop 추가
→ 권한 거부 시 403 페이지 표시
- 모든 라우트에 권한 리소스 명시
- MainLayout 사이드바: parent-inference-workflow + admin 로그 메뉴 추가
- 사이드바 hasAccess 필터링 (이전부터 구현됨, 신규 메뉴에도 자동 적용)
Phase 4-6: 신규 페이지 3종
- ParentReview.tsx: 모선 확정/거부/리셋 + 신규 등록 폼
- ParentExclusion.tsx: GROUP/GLOBAL 제외 등록 + 해제
- LabelSession.tsx: 학습 세션 생성/취소
- AuditLogs.tsx: 감사 로그 조회
- AccessLogs.tsx: 접근 이력 조회
- LoginHistoryView.tsx: 로그인 이력 조회
Phase 4-7: i18n 키 + 라우터 등록
- 한국어/영어 nav.* + group.* 키 추가
- App.tsx에 12개 신규 라우트 등록 + 권한 가드 적용
Phase 4-8: 검증 완료
- 백엔드 컴파일/기동 성공
- 프론트엔드 빌드 성공 (475ms)
- E2E 시나리오:
- operator 로그인 → CONFIRM 확정 → MANUAL_CONFIRMED 갱신
- operator GROUP 제외 → 성공
- operator GLOBAL 제외 → 403 FORBIDDEN (권한 없음)
- operator 학습 세션 생성 → ACTIVE
- admin GLOBAL 제외 → 성공
- 감사 로그 자동 기록: REVIEW_PARENT/EXCLUDE_CANDIDATE_GROUP/
LABEL_PARENT_CREATE/EXCLUDE_CANDIDATE_GLOBAL 등 14건
- 권한 트리 RBAC + AOP 정상 동작 확인
설계 핵심:
- 운영자 의사결정만 자체 DB에 저장 (HYBRID)
- iran 백엔드 데이터는 향후 Phase 5에서 합쳐서 표시
- @RequirePermission + @Auditable로 모든 액션 권한 + 감사 자동화
- 데모 계정으로 완전한 워크플로우 시연 가능
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-07 09:44:43 +09:00