본문으로 건너뛰기

Filament 패널 개요

📝 초안 (Draft)

이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.

Level 0~6 계층별 Filament 관리 패널 시스템을 소개합니다.

개요

Multi-SaaS Kit은 권한 시스템 (Level 0~6, ADR-058)에 맞춰 계층별 독립 패널을 제공합니다. 각 패널은 해당 권한 레벨에 최적화된 UI와 기능을 제공하며, URL 경로는 환경변수로 커스터마이징 가능합니다.

왜 패널을 분리하는가?

단일 패널계층별 패널 분리
권한 체크 누락 시 보안 취약애초에 해당 메뉴만 존재
복잡한 조건부 UI역할에 최적화된 UI
동일한 URL계층별 다른 URL (보안 강화)

결론: 계층별 패널 분리가 권한 시스템 (Level 0~6, ADR-058)의 의도와 일치하며, 보안상 더 견고합니다.

Level 0~6 계층 패널 구조

┌─────────────────────────────────────────────────────────────┐
│ Filament 패널 구조 │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Platform (Level 0) │ │
│ │ • 플랫폼 전체 관리자 │ │
│ │ • SaaS 제품, 전체 사용자, 시스템 설정 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Saas (Level 1) │ │
│ │ • SaaS 제품 운영 관리자 │ │
│ │ • 테넌트 관리, SaaS별 설정 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Tenant (Level 2) │ │
│ │ • 테넌트/고객사 관리자 │ │
│ │ • 조직 관리, 테넌트 설정 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Org (Level 3) │ │
│ │ • 조직 관리자 │ │
│ │ • 워크스페이스 관리 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Workspace (Level 4) │ │
│ │ • 워크스페이스 관리자 │ │
│ │ • 팀/그룹 관리 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Team (Level 5) │ │
│ │ • 그룹 리더 │ │
│ │ • 팀원 관리 │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ App (Level 6) │ │
│ │ • 일반 사용자 (Member) │ │
│ │ • 개인 설정, 마이페이지 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

패널별 요약

관리 패널 (Backoffice)

레벨역할패널 ID기본 경로주요 기능
0Platform Adminplatform/platformSaaS 제품 관리, 전체 감사 로그, 시스템 설정
1SaaS Adminsaas/saas테넌트 관리, Tenant Admin 배정
2Tenant Admintenant/tenant조직 관리, 사용자 관리, Guardian 관계
3Organization Adminorg/org워크스페이스 관리, 조직 설정
4Workspace Adminworkspace/workspace팀/그룹 관리, 워크스페이스 설정
5Group Leaderteam/team팀원 관리, 팀 대시보드

사용자 영역 (Frontend)

레벨역할패널 ID기본 경로설명
6Memberapp/app로그인 사용자 영역
-Guestweb/공개 웹사이트 (Filament 외)

URL 구조

기본 구조

https://example.com/
├── / → 랜딩 페이지 (Guest)
├── /app → 회원 영역 (Level 6)
├── /team → 그룹 리더 패널 (Level 5)
├── /workspace → 워크스페이스 패널 (Level 4)
├── /org → 조직 관리 패널 (Level 3)
├── /tenant → 테넌트 관리 패널 (Level 2)
├── /saas → SaaS 운영 패널 (Level 1)
└── /platform → 플랫폼 관리 패널 (Level 0)

로그인 URL

각 패널은 독립된 로그인 페이지를 가집니다:

/platform/login   → Platform Admin 로그인
/saas/login → SaaS Admin 로그인
/tenant/login → Tenant Admin 로그인
/app/login → 일반 사용자 로그인

환경변수 설정

.env 설정

#──────────────────────────────────────────────────────────────────
# PANEL PATHS (Level 0~6 계층 권한별 패널 경로)
#──────────────────────────────────────────────────────────────────

# Level 0: Platform Admin (내부 운영팀 - 보안상 숨김 경로 권장)
PANEL_PATH_PLATFORM=platform

# Level 1: SaaS Admin (SaaS 운영 관리)
PANEL_PATH_SAAS=saas

# Level 2: Tenant Admin (테넌트/고객사 관리)
PANEL_PATH_TENANT=tenant

# Level 3: Organization Admin (조직 관리)
PANEL_PATH_ORG=org

# Level 4: Workspace Admin (워크스페이스 관리)
PANEL_PATH_WORKSPACE=workspace

# Level 5: Group Leader (팀/그룹 관리)
PANEL_PATH_TEAM=team

# Level 6: Member (일반 사용자 영역)
PANEL_PATH_APP=app

보안 권장 설정 (프로덕션)

# 내부 관리자 패널은 알기 어려운 경로 사용
PANEL_PATH_PLATFORM=ops-x7k9m2
PANEL_PATH_SAAS=mgmt-f4a2b8

# 고객용 패널은 친숙한 경로 유지
PANEL_PATH_TENANT=admin
PANEL_PATH_ORG=manage
보안 팁

Platform, SaaS 패널처럼 내부 관리자용 패널은 알기 어려운 경로로 설정하면 무차별 대입 공격을 줄일 수 있습니다.


파일 구조

PanelProvider 위치

app/Providers/Filament/
├── PlatformPanelProvider.php # Level 0
├── SaasPanelProvider.php # Level 1
├── TenantPanelProvider.php # Level 2
├── OrgPanelProvider.php # Level 3
├── WorkspacePanelProvider.php # Level 4
├── TeamPanelProvider.php # Level 5
└── AppPanelProvider.php # Level 6

Filament 리소스 구조

app/Filament/
├── Resources/ # 공유 리소스 (모든 패널에서 사용 가능)
│ ├── UserResource.php
│ ├── TenantResource.php
│ └── ...

├── Platform/ # Level 0 전용
│ ├── Resources/
│ │ ├── SaasProductResource.php
│ │ ├── SaasAdminResource.php
│ │ └── AuditLogResource.php
│ ├── Pages/
│ └── Widgets/

├── Saas/ # Level 1 전용
│ ├── Resources/
│ │ ├── TenantResource.php
│ │ └── TenantAdminResource.php
│ ├── Pages/
│ └── Widgets/

├── Tenant/ # Level 2 전용
│ ├── Resources/
│ │ ├── OrganizationResource.php
│ │ ├── GuardianRelationshipResource.php
│ │ └── AuditLogResource.php
│ ├── Pages/
│ └── Widgets/

├── Org/ # Level 3 전용
├── Workspace/ # Level 4 전용
├── Team/ # Level 5 전용
│ └── Resources/
│ └── MemberResource.php

└── App/ # Level 6 전용
├── Resources/
├── Pages/
└── Widgets/

접근 제어

EnsureUserLevel 미들웨어

각 패널은 EnsureUserLevel 미들웨어를 통해 접근을 제어합니다.

// PlatformPanelProvider.php
->authMiddleware([
Authenticate::class,
EnsureUserLevel::class.':0', // Level 0만 접근
])

// TenantPanelProvider.php
->authMiddleware([
Authenticate::class,
EnsureUserLevel::class.':0,1,2', // Level 0-2 접근 가능
])

계층 원칙

상위 레벨은 하위 레벨 패널에 접근 가능합니다:

접근자PlatformSaasTenantOrgWorkspaceTeamApp
Level 0
Level 1
Level 2
Level 3
Level 4
Level 5
Level 6

리소스별 데이터 필터링

공유 리소스는 사용자 레벨에 따라 조회 범위가 달라집니다:

// UserResource.php (공유 리소스)
public static function getEloquentQuery(): Builder
{
$user = auth()->user();
$query = parent::getEloquentQuery();

return match($user->level) {
0, 1 => $query, // 전체
2, 3 => $query->where('tenant_id', $user->tenant_id), // 테넌트 내
4, 5 => $query->where('workspace_id', $user->workspace_id), // 워크스페이스 내
default => $query->where('id', $user->id), // 본인만
};
}

구현 현황

Phase 1: 기본 구조 ✅

패널상태설명
PlatformPanelProviderLevel 0-1 통합
SaasPanelProviderLevel 1 분리
TenantPanelProviderLevel 2
OrgPanelProviderLevel 3
WorkspacePanelProviderLevel 4
TeamPanelProviderLevel 5
AppPanelProviderLevel 6

Phase 2: 고급 기능

기능상태설명
Tenant Switch🔶상위 관리자의 테넌트 선택
Impersonation🔶하위 사용자로 전환
패널별 테마계층별 색상/스타일
패널별 대시보드역할별 위젯

관련 문서