Files
sam-manage/app/Http/Controllers/Api/Admin/PermissionAnalyzeController.php
hskwon 1fc530bca2 feat(mng): 권한 분석 페이지 구현
- 메뉴별 권한 분석 기능 (접근 가능/불가 사용자 목록)
- 사용자 역추적 기능 (역할/부서/개인별 권한 추적)
- CSV 내보내기 기능
- 트리 구조 시각화 (└─ 연결선, 폴더/문서 아이콘)
- 중복 메뉴 표시 문제 해결 (테넌트별 메뉴만 표시)
2025-11-26 21:42:51 +09:00

143 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Admin;
use App\Http\Controllers\Controller;
use App\Services\PermissionAnalyzeService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class PermissionAnalyzeController extends Controller
{
public function __construct(
private PermissionAnalyzeService $service
) {}
/**
* 메뉴 트리 조회 (HTMX용)
*/
public function menuTree(Request $request): JsonResponse|string
{
$tenantId = session('selected_tenant_id');
$search = $request->input('search');
$menuTree = $this->service->getMenuTree($tenantId, $search);
if ($request->header('HX-Request')) {
$html = view('permission-analyze.partials.menu-tree', [
'menuTree' => $menuTree,
])->render();
return response()->json(['html' => $html]);
}
return response()->json([
'success' => true,
'data' => $menuTree,
]);
}
/**
* 특정 메뉴의 권한 분석
*/
public function analyzeMenu(Request $request): JsonResponse|string
{
$menuId = $request->input('menu_id');
$permissionType = $request->input('permission_type', 'view');
$tenantId = session('selected_tenant_id');
if (! $menuId) {
return response()->json([
'success' => false,
'message' => '메뉴를 선택해주세요.',
], 400);
}
$analysis = $this->service->analyzeMenuPermission($menuId, $permissionType, $tenantId);
if ($request->header('HX-Request')) {
$html = view('permission-analyze.partials.analysis-result', [
'analysis' => $analysis,
'permissionType' => $permissionType,
])->render();
return response()->json(['html' => $html]);
}
return response()->json([
'success' => true,
'data' => $analysis,
]);
}
/**
* 사용자 역추적
*/
public function traceUsers(Request $request): JsonResponse|string
{
$menuId = $request->input('menu_id');
$permissionType = $request->input('permission_type', 'view');
$tenantId = session('selected_tenant_id');
if (! $menuId) {
return response()->json([
'success' => false,
'message' => '메뉴를 선택해주세요.',
], 400);
}
$trace = $this->service->traceUsersWithPermission($menuId, $permissionType, $tenantId);
if ($request->header('HX-Request')) {
$html = view('permission-analyze.partials.trace-result', [
'trace' => $trace,
'permissionType' => $permissionType,
])->render();
return response()->json(['html' => $html]);
}
return response()->json([
'success' => true,
'data' => $trace,
]);
}
/**
* CSV 내보내기
*/
public function exportCsv(Request $request): Response
{
$menuId = $request->input('menu_id');
$permissionType = $request->input('permission_type', 'view');
$tenantId = session('selected_tenant_id');
if (! $menuId) {
return response('메뉴를 선택해주세요.', 400);
}
$csv = $this->service->exportToCsv($menuId, $permissionType, $tenantId);
$filename = "permission_analysis_{$menuId}_{$permissionType}_".date('Ymd_His').'.csv';
return response($csv)
->header('Content-Type', 'text/csv; charset=UTF-8')
->header('Content-Disposition', "attachment; filename=\"{$filename}\"")
->header('Content-Transfer-Encoding', 'binary');
}
/**
* 권한 재계산 (캐시 무효화)
*/
public function recalculate(Request $request): JsonResponse
{
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
return response()->json([
'success' => true,
'message' => '권한이 재계산되었습니다.',
]);
}
}