
이 계획은 최고 관리자가 각 테넌트별 설정(로고, SEO, 소셜링크)과 디자인(템플릿, 메인 레이아웃)을 완벽하게 개별 관리할 수 있도록 구조를 개선하고, 일반 테넌트와 회원이 꼬이지 않도록 권한을 명확히 분리하는 것을 목표로 합니다.
흐름 요약 (User Workflow)
- 일반인 회원가입 및 테넌트 신청
- 최고 관리자의 테넌트 개설: 최고 관리자가 어드민에서 테넌트 ID(handle)와 사이트명 등을 입력하여 테넌트를 개설. 이때 꼬임 방지를 위해 완벽히 독립된 기본 설정값(로고, SEO, 디자인 기본값 등)이 해당 테넌트 전용으로 자동 세팅됨.
- 일반 테넌트 마이페이지: 테넌트 소유자는 자신의 "마이페이지"에 접속하여 본인의 기본 정보, 템플릿 변경 및 자신의 테넌트에 가입한 회원 관리를 독립적으로 수행.
Proposed Changes
1. 최고 관리자용: 테넌트 개설 및 통합 관리
[MODIFY]
src/Controllers/TenantAdminController.php
- 테넌트 개설 (
tenantCreate/tenantStore):- 신규 테넌트 생성 기능 추가.
- 생성 시 대상 테넌트 ID를 강제로 할당하여 기본
tenant_settings(초기 로고, 폰트 등) 및 기본templates레코드 5종을 독립적으로 DB에 복사/생성.
- 테넌트 수정 (
tenantEdit($id)):- 기존 기본 정보뿐만 아니라 대상 테넌트의 템플릿, 슬라이드, 배너, 설정 정보(
TenantSetting)를 모두 불러와서 View에 전달.
- 기존 기본 정보뿐만 아니라 대상 테넌트의 템플릿, 슬라이드, 배너, 설정 정보(
- 테넌트 전용 저장 로직 추가 (접속 중인 세션 테넌트가 아닌,
$id테넌트 DB만 수정하도록$targetTenantId사용):-
tenantUpdateSettings($id): 대상 테넌트의 로고, SEO, 소셜링크 저장 -
tenantUpdateMainLayout($id): 대상 테넌트의 메인 레이아웃 저장 -
tenantApplyTemplate($id)/tenantSaveTemplateSettings($id): 대상 테넌트의 템플릿 적용 및 설정 저장
-
[MODIFY]
templates/admin/tenant_edit.php
(최고 관리자용)
- 탭 인터페이스 도입:
- 기본 정보
- 템플릿 관리
- 메인 레이아웃 관리
- 로고 관리
- SEO 설정
- 소셜 링크
- 각 폼 제출 시 대상 테넌트 ID가 명시된 엔드포인트(
.../admin/tenants/update_settings/<?= $targetTenant['id'] ?>)를 호출하여 세션 충돌 원천 차단.
2. 일반 테넌트용: 독립된 마이페이지
[NEW]
src/Controllers/MyPageController.php
(또는 기존 로직 마이페이지화)
- 일반 테넌트(Level < 10)는 기존의 방대한 "환경설정", "디자인 관리" 메뉴 대신, 자신의 테넌트에 종속된 마이페이지 기능만 사용.
- 마이페이지 구성 요소:
- 기본정보 수정
- 템플릿 변경 (최고 관리자가 세팅해둔 기본 템플릿 목록 중 선택)
- 회원 관리 (
users테이블에서tenant_id가 본인 테넌트인 회원만 조회/관리)
- 일반 테넌트가 설정이나 회원을 수정할 때는 기존처럼 보안이 확보된
Tenant::getId()기반 쿼리를 사용해 타 테넌트 데이터 침범을 100% 방지.
3. Core Models & Database 독립성 강화
-
BaseModel혹은 컨트롤러 단에서 최고 관리자가 대리 수정할 수 있도록 임시적으로 타겟 테넌트 ID($targetTenantId)를 바인딩할 수 있는 인터페이스 지원. - 일반 사용자가 회원가입 시 현재 접속 중인 테넌트의 URL 도메인/경로(handle)에 해당하는
tenant_id를 소속으로 가지게 되어 회원 관리 시 철저히 분리됨 (이미 일부 구현되어 있음).
Verification Plan
Automated / Manual Verification
- 최고 관리자 계정으로 테넌트 관리 메뉴에 진입하여 신규 테넌트(A)를 개설합니다 (기본 설정 자동 생성 확인).
- 개설된 테넌트(A) 관리 페이지(
admin/tenants/edit/A)에서 로고, SEO, 메인 레이아웃을 수정하고 저장합니다. - 최고 관리자 자신이 속한 메인 테넌트(B)의 설정은 전혀 변함이 없고, 오직 A 테넌트 사이트에만 적용되었는지 확인하여 꼬임 현상이 없음을 검증합니다.
- 일반 테넌트(A의 소유자)로 로그인하여 마이페이지에 접속, 템플릿을 변경하고 테넌트(A)에 가입한 회원이 정상적으로 회원관리에 노출되는지 확인합니다.
댓글 (1)
요청하신 대로 최고 관리자가 일반 회원을 대상으로 테넌트를 개설해 주고, 각 테넌트는 자신의 마이페이지(관리자)에서 디자인과 설정을 관리할 수 있는 완벽한 분리 환경을 구축했습니다.
1. 최고 관리자 전용 테넌트 개설 기능 추가
templates/admin/tenants.php
상단에 테넌트 개설 버튼을 추가했습니다.
개설 화면(
templates/admin/tenant_create.php
)을 신규 작성하여, 테넌트명, 접속 핸들명, 그리고 소유할 회원의 아이디를 입력받아 테넌트를 신규로 구성할 수 있도록 했습니다.
테넌트 생성 로직(TenantAdminController::tenantStore)에서 계정 생성 시 즉시 기본 템플릿(5종) 및 초기 테넌트 설정이 데이터베이스에 자동 주입되어 바로 사이트가 작동할 수 있도록 구현했습니다.
2. 최고 관리자 - 특정 테넌트 개별 상세 관리 (탭 분리)
기존의 테넌트 수정 화면(
templates/admin/tenant_edit.php
)을 전면 개편하여 탭 UI로 구성했습니다.
기본정보: 테넌트 소유자 정보, 허용 게시판, 커스텀 도메인 등
템플릿관리: 특정 템플릿 강제 적용 및 색상/폰트 변경
메인 레이아웃: JSON 형태로 메인 페이지 구성 변경
로고관리 / SEO 설정 / 소셜링크: 해당 테넌트의 세부 환경설정 변경
컨트롤러 내에 tenantUpdateSettings, tenantApplyTemplateTarget 등의 전용 엔드포인트를 추가하여, 최고 관리자가 타겟 ID를 지정해 해당 테넌트의 설정을 강제로 덮어쓸 수 있도록 데이터 분리 처리를 완료했습니다.
3. 일반 테넌트용 마이페이지 사이드바 적용
관리자 패널의 공통 헤더 파일(
templates/admin/layout_header.php
)에서 접속자의 권한($_SESSION['level'])에 따라 사이드바 메뉴 텍스트를 완전히 분리했습니다.
최고 관리자(레벨 10): "테넌트 통합관리", "전체 회원관리", "전체 대시보드" 등 통합 관리 목적의 메뉴로 노출.
일반 테넌트(레벨 5): "마이페이지" 영역 하위에 "내 정보 요약", "기본정보 변경(환경설정)", "템플릿 변경(디자인관리)", "소속 회원관리" 등으로 노출.
일반 테넌트는 기존처럼 자신의 고유 도메인이나 세션에 귀속된 Tenant::getCurrent() 데이터만 다루게 되므로 데이터가 꼬이는 일이 발생하지 않습니다.
TIP
이제 일반 회원이 회원가입을 마치면, 최고 관리자 계정으로 로그인하여 테넌트 관리 > 테넌트 개설 메뉴에서 대상 회원의 아이디를 입력해 사이트를 열어줄 수 있습니다. 이후 해당 회원은 자신의 테넌트 도메인(/handle/admin)으로 접속하여 "마이페이지" 형태로 디자인을 직접 꾸미게 됩니다.
댓글 쓰기