리소스 가시성(READ/HIDE) 단일 차원에서 리소스 × 오퍼레이션(RCUD) 2차원 권한 모델로 전환하여 세밀한 CRUD 권한 제어 지원. - DB: AUTH_PERM에 OPER_CD 컬럼 추가, 마이그레이션 004 작성 - DB: AUTH_PERM_TREE 리소스 트리 테이블 추가 (마이그레이션 003) - Backend: permResolver 2차원 권한 해석 엔진 (상속 + 오퍼레이션) - Backend: requirePermission 미들웨어 신규 (리소스×오퍼레이션 검증) - Backend: authService permissions → Record<string, string[]> 반환 - Backend: roleService/roleRouter OPER_CD 지원 API - Backend: Helmet CORP 설정 (sendBeacon cross-origin 허용) - Frontend: authStore.hasPermission(resource, operation?) 하위 호환 확장 - Frontend: PermissionsPanel 역할탭 + RCUD 4열 매트릭스 UI 전면 재작성 - Frontend: sendBeacon API_BASE_URL 절대경로 전환 - Docs: COMMON-GUIDE 권한 체계 + CRUD API 규칙 문서화 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
25 lines
874 B
TypeScript
25 lines
874 B
TypeScript
import { useEffect } from 'react';
|
|
import { useAuthStore } from '@common/store/authStore';
|
|
import { API_BASE_URL } from '@common/services/api';
|
|
|
|
/**
|
|
* 서브탭 진입 시 감사 로그를 기록하는 훅.
|
|
* App.tsx의 탭 레벨 TAB_VIEW와 함께, 서브탭 레벨 SUBTAB_VIEW를 기록한다.
|
|
*
|
|
* N-depth 지원: 콜론 구분 경로 (예: 'aerial:media', 'admin:users', 'a:b:c:d')
|
|
*
|
|
* @param featureId - 콜론 구분 리소스 경로
|
|
*/
|
|
export function useFeatureTracking(featureId: string) {
|
|
const isAuthenticated = useAuthStore((s) => s.isAuthenticated);
|
|
|
|
useEffect(() => {
|
|
if (!isAuthenticated || !featureId) return;
|
|
const blob = new Blob(
|
|
[JSON.stringify({ action: 'SUBTAB_VIEW', detail: featureId })],
|
|
{ type: 'text/plain' },
|
|
);
|
|
navigator.sendBeacon(`${API_BASE_URL}/audit/log`, blob);
|
|
}, [featureId, isAuthenticated]);
|
|
}
|