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 기능
| 기능 | 설명 |
|---|---|
| brandName | SaaS Product 이름 표시 (L1의 saasProduct.name, logo_url 등록 시 로고) |
| 패널간 네비게이션 | 우상단 메뉴에서 Platform 패널로 이동 (L0만) |
| SafeDeleteAction | 모든 삭제에 "DELETE {대상명}" 입력 확인 |
| Tenant 관리 페이지 | Tenant 목록에서 바로 Tenant 패널로 이동 버튼 |
| SaaS Product 필수 | Tenant 생성 시 SaaS Product 선택 필수 |
주요 기능
1. 테넌트(고객사) 관리
TenantResource 주요 필드:
| 필드 | 설명 | 예시 |
|---|---|---|
name | 테넌트명 | "ABC 학원" |
slug | URL 식별자 | "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(),
])
사용 사례:
- 고객이 겪는 문제 재현
- 테넌트 설정 확인
- 신규 고객 온보딩 지원