본문으로 건너뛰기

SaaS 패널 (Level 1)

📝 초안 (Draft)

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

SaaS Admin 전용 패널 기능을 설명합니다.

개요

SaaS 패널은 **Level 1 (SaaS Admin)**을 위한 관리 패널입니다. 특정 SaaS 제품의 테넌트(고객사)를 관리하고, Tenant Admin을 배정하며, 구독/요금제를 설정합니다.

접근 권한

항목
권한 레벨Level 1 (SaaS Admin)
기본 경로/saas
환경변수PANEL_PATH_SAAS
접근 가능자Level 0, 1

담당 범위

SaaS Admin은 배정된 SaaS 제품 내에서만 권한을 가집니다:

SaaS Product A (담당)
├── Tenant 1 ✅ 관리 가능
├── Tenant 2 ✅ 관리 가능
└── Tenant 3 ✅ 관리 가능

SaaS Product B (미배정)
├── Tenant 4 ❌ 접근 불가
└── Tenant 5 ❌ 접근 불가

범용 UX 기능

기능설명
brandNameSaaS Product 이름 표시 (L1의 saasProduct.name, logo_url 등록 시 로고)
패널간 네비게이션우상단 메뉴에서 Platform 패널로 이동 (L0만)
SafeDeleteAction모든 삭제에 "DELETE {대상명}" 입력 확인
Tenant 관리 페이지Tenant 목록에서 바로 Tenant 패널로 이동 버튼
SaaS Product 필수Tenant 생성 시 SaaS Product 선택 필수

주요 기능

1. 테넌트(고객사) 관리

TenantResource 주요 필드:

필드설명예시
name테넌트명"ABC 학원"
slugURL 식별자"abc-academy"
domain커스텀 도메인"abc.lms.com"
subscription_plan구독 요금제free, starter, professional, enterprise
max_users최대 사용자 수10, 50, 100, unlimited
is_active활성화 여부true/false

테넌트 목록 필터:

  • 구독 요금제별 필터
  • 활성/비활성 필터
  • 생성일 정렬

2. 구독 요금제 설정

요금제설명기능
Free무료 체험기본 기능, 10명 제한
Starter소규모 팀핵심 기능, 50명 제한
Professional중소기업고급 기능, 100명 제한
Enterprise대기업전체 기능, 무제한
// TenantResource.php
Forms\Components\Select::make('subscription_plan')
->options([
'free' => 'Free',
'starter' => 'Starter',
'professional' => 'Professional',
'enterprise' => 'Enterprise',
])
->default('free')
->required(),

3. Tenant Admin 관리

각 테넌트에 대한 **Level 2 관리자(Tenant Admin)**를 생성하고 관리합니다.

TenantAdminResource 기능:

  • Tenant Admin 계정 생성/수정/삭제
  • 담당 테넌트 배정
  • Impersonate 액션 (Tenant Admin으로 전환)

4. 테넌트 통계

지표설명
총 테넌트 수관리 중인 테넌트 개수
활성 테넌트is_active = true
요금제별 분포Free/Starter/Pro/Enterprise 비율
월간 성장률신규 테넌트 증가율

파일 구조

app/Filament/Saas/
├── Resources/
│ ├── TenantResource.php
│ │ └── Pages/
│ │ ├── ListTenants.php
│ │ ├── CreateTenant.php
│ │ └── EditTenant.php
│ │
│ └── TenantAdminResource.php
│ └── Pages/
│ ├── ListTenantAdmins.php
│ ├── CreateTenantAdmin.php
│ └── EditTenantAdmin.php

├── Pages/
│ └── Dashboard.php

└── Widgets/
├── TenantStatsWidget.php
└── SubscriptionChartWidget.php

PanelProvider 설정

// app/Providers/Filament/SaasPanelProvider.php

class SaasPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('saas')
->path(env('PANEL_PATH_SAAS', 'saas'))
->login()
->colors(['primary' => Color::Orange])
->discoverResources(
in: app_path('Filament/Saas/Resources'),
for: 'App\Filament\Saas\Resources'
)
->authMiddleware([
Authenticate::class,
EnsureUserLevel::class.':0,1', // Level 0-1 접근
]);
}
}

데이터 필터링

SaaS Admin은 담당 SaaS 제품의 테넌트만 조회할 수 있습니다:

// TenantResource.php
public static function getEloquentQuery(): Builder
{
$user = auth()->user();
$query = parent::getEloquentQuery();

// Level 0: 전체 조회
if ($user->level === 0) {
return $query;
}

// Level 1: 담당 SaaS의 테넌트만
return $query->whereIn('saas_product_id', $user->managedSaasProductIds());
}

Impersonate 기능

SaaS Admin은 Tenant Admin으로 전환하여 고객 지원을 수행할 수 있습니다:

// TenantAdminResource.php
->recordActions([
ImpersonateAction::make()
->visible(fn () => auth()->user()->level <= 1),
EditAction::make(),
])

사용 사례:

  • 고객이 겪는 문제 재현
  • 테넌트 설정 확인
  • 신규 고객 온보딩 지원

관련 문서