Platform 패널 (Level 0)
이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.
Platform Admin 전용 패널 기능을 설명합니다.
개요
Platform 패널은 **권한 시스템 (Level 0~6, ADR-058)의 최상위 레벨(Level 0)**을 위한 관리 패널입니다. 플랫폼 전체를 관리하며, SaaS 제품 생성/관리, 전체 사용자 관리, 시스템 설정 등의 기능을 제공합니다.
접근 권한
| 항목 | 값 |
|---|---|
| 권한 레벨 | Level 0 (Platform Admin) |
| 기본 경로 | /platform |
| 환경변수 | PANEL_PATH_PLATFORM |
| 접근 가능자 | Level 0만 |
프로덕션 환경에서는 예측하기 어려운 경로를 사용하세요:
PANEL_PATH_PLATFORM=ops-x7k9m2
주요 기능
1. SaaS 제품 관리
Multi-SaaS Kit은 하나의 플랫폼에서 여러 SaaS 제품을 운영할 수 있습니다. Platform 패널에서 각 SaaS 제품을 생성하고 관리합니다.
Platform
├── SaaS Product A (LMS)
│ ├── Tenant 1 (학원 A)
│ └── Tenant 2 (학원 B)
│
└── SaaS Product B (CRM)
├── Tenant 3 (회사 A)
└── Tenant 4 (회사 B)
SaasProductResource 주요 필드:
| 필드 | 설명 | 예시 |
|---|---|---|
name | SaaS 제품명 | "온라인 학습 플랫폼" |
slug | URL 식별자 | "lms" |
description | 제품 설명 | "학원 관리 시스템" |
logo_url | 로고 이미지 URL | "https://..." |
is_active | 활성화 여부 | true/false |
level_labels | 계층 이름 커스터마이징 | Level 2→"학원장", Level 3→"캠퍼스" |
settings | 제품별 커스텀 설정 | JSON |
2. Tenant Domains & Sites
Platform Admin은 Tenant Domains & Sites 메뉴에서 Tenant별 도메인과 사이트 분리 설정을 확인하고 수정합니다.
| 항목 | 필드 | 설명 |
|---|---|---|
| 대표 도메인 | primary_domain | Tenant의 기본 도메인 |
| 별칭 도메인 | domain_aliases | 같은 Tenant로 연결되는 추가 도메인 |
| 서브도메인 매핑 | subdomain_mapping | 서브도메인별 level/panel 라우팅 규칙 |
| 미러사이트 | settings.custom_theme | 같은 작업영역에서 Blade/브랜딩만 오버레이 |
| 독립사이트 | settings.site | app/Sites/{StudlyName} 기반 독립 작업영역 |
| Legacy 도메인 | settings.domains | 기존 settings 기반 도메인 목록 |
MSK에서는 settings.custom_theme 기반 오버레이를 미러사이트, settings.site 기반 작업영역 분리를 독립사이트라고 부릅니다.
3. Help Pages
Help Pages 메뉴는 Platform Admin이 관리페이지별 안내 문구를 직접 편집하는 시스템입니다.
| 필드 | 설명 |
|---|---|
panel | 도움말이 적용될 패널. 예: platform |
page_key | 페이지/기능 키. 예: tenant-domains.index |
summary | 페이지 제목 아래 설명 |
guide_body | 목록 상단 안내 |
modal_body | ? 모달 매뉴얼 |
visible_levels | 도움말 공개 대상 level |
Tenant Domains & Sites의 기본 도움말 키는 platform / tenant-domains.index입니다.
범용 UX 기능
| 기능 | 설명 |
|---|---|
| 패널간 네비게이션 | 우상단 메뉴에서 SaaS 패널로 이동 |
| brandName | "Platform Admin" 좌상단 표시 |
| SafeDeleteAction | 모든 삭제에 "DELETE {대상명}" 입력 확인 |
| Tenant 관리 페이지 이동 | Tenant 목록에서 바로 Tenant 패널로 이동 |
| 로그인 리다이렉트 | /dashboard → Level 0은 Platform으로 자동 이동 |
4. 계층 이름 커스터마이징
각 SaaS 제품은 도메인에 맞게 계층 이름을 커스터마이징할 수 있습니다.
| Level | 기본값 | LMS 예시 | CRM 예시 |
|---|---|---|---|
| 2 | Tenant Admin | 학원장 | 고객사 관리자 |
| 3 | Organization Admin | 캠퍼스장 | 부서장 |
| 4 | Workspace Admin | 담당자 | 팀장 |
| 5 | Group Leader | 담임 | 파트장 |
| 6 | Member | 학생 | 영업사원 |
Level 0 (Platform Admin)과 Level 1 (SaaS Admin)은 시스템 고정값으로 변경할 수 없습니다.
5. SaaS Admin 관리
각 SaaS 제품에 대한 **Level 1 관리자(SaaS Admin)**를 생성하고 관리합니다.
SaasAdminResource 기능:
- SaaS Admin 계정 생성/수정/삭제
- 담당 SaaS 제품 배정
- Impersonate 액션 (SaaS Admin으로 전환)
6. Plugin 매트릭스 UI (v1.25.0+)
Platform Admin 이 SaaS×Plugin 매트릭스를 토글하여 Plugin 활성화/비활성화를 관리합니다. 추가: 2026-05-05 (demo 1.7.2 → template 1.25.0 sync)
Platform → SaaS 매트릭스
Platform → System → SaaS Plugins 메뉴에서 모든 application plugin (manifest.kind=application) 의 SaaS 별 활성화 상태를 한눈에 관리.
| 기능 | 설명 |
|---|---|
| 자동 발견 | manifest.kind=application plugin 만 컬럼으로 노출 (slug kebab-case) |
| 상호 배타 처리 | manifest.scope.mutually_exclusive 플러그인 동시 활성화 차단 (예: Commerce + LunarCommerce) |
| 즉시 반영 | 토글 시 saas_plugins 테이블 업데이트 + 캐시 무효화 |
| 전이 검증 | 의존성 plugin 비활성화 시 의존하는 plugin 자동 비활성화 안내 |
SaaS Admin → Tenant 매트릭스
SaaS → System → Tenant Plugins 메뉴에서 자기 SaaS 의 tenant 별로 plugin 활성화 (SaaS Admin 권한 한정).
| 기능 | 설명 |
|---|---|
| 2계층 활성화 | SaaS 매트릭스에서 ON 된 plugin 만 tenant 매트릭스에 노출 |
| Tenant override | tenant 별 plugin on/off 가능 (SaaS Admin 권한 내) |
EnsurePluginActive middleware
비활성화된 plugin 의 라우트 접근 시 자동 404 반환:
Route::middleware(['plugin.active:my-plugin'])->group(function () {
// ...
});
→ core_plugins.is_enabled = false 면 즉시 404. UI 메뉴는 shouldRegisterNavigation 으로 자동 숨김.
7. 전체 감사 로그
플랫폼 전체의 감사 로그를 조회할 수 있습니다.
AuditLogResource 컬럼:
| 컬럼 | 설명 |
|---|---|
user | 액션 수행자 |
action | 수행 액션 (created, updated, deleted) |
model | 대상 모델 |
changes | 변경 내용 (old → new) |
ip_address | IP 주소 |
created_at | 발생 시간 |
파일 구조
app/Filament/Platform/
├── Resources/
│ ├── SaasProductResource.php
│ │ └── Pages/
│ │ ├── ListSaasProducts.php
│ │ ├── CreateSaasProduct.php
│ │ └── EditSaasProduct.php
│ │
│ ├── SaasAdminResource.php
│ │ └── Pages/
│ │ ├── ListSaasAdmins.php
│ │ ├── CreateSaasAdmin.php
│ │ └── EditSaasAdmin.php
│ │
│ ├── TenantDomainResource.php
│ │ └── Pages/
│ │ ├── ListTenantDomains.php
│ │ └── EditTenantDomain.php
│ │
│ ├── AdminHelpPageResource.php
│ │ └── Pages/
│ │ ├── ListAdminHelpPages.php
│ │ ├── CreateAdminHelpPage.php
│ │ └── EditAdminHelpPage.php
│ │
│ └── AuditLogResource.php
│ └── Pages/
│ ├── ListAuditLogs.php
│ └── ViewAuditLog.php
│
├── Pages/
│ └── Dashboard.php
│
└── Widgets/
└── StatsOverviewWidget.php
PanelProvider 설정
// app/Providers/Filament/PlatformPanelProvider.php
class PlatformPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('platform')
->path(env('PANEL_PATH_PLATFORM', 'platform'))
->login()
->colors(['primary' => Color::Red])
->discoverResources(
in: app_path('Filament/Platform/Resources'),
for: 'App\Filament\Platform\Resources'
)
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
AuthenticateSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
])
->authMiddleware([
Authenticate::class,
EnsureUserLevel::class.':0', // Level 0만 접근
]);
}
}
Impersonate 기능
Platform Admin은 SaaS Admin으로 전환하여 해당 사용자 시점에서 시스템을 확인할 수 있습니다.
// SaasAdminResource.php
use App\Core\Extensions\Impersonate\Filament\Actions\ImpersonateAction;
public static function table(Table $table): Table
{
return $table
->columns([...])
->recordActions([
ImpersonateAction::make(), // Impersonate 액션
EditAction::make(),
]);
}
Impersonate 규칙:
- Level 0은 Level 1-6 모두 전환 가능
- 전환 사유 선택 필수 (support, debugging, training, audit, other)
- 모든 전환 기록은
impersonation_logs테이블에 저장