forked from baron/baron-sso
- Refactor `GetActiveTenants` to filter dynamically based on the email domain, removing hardcoded affiliate slugs. - Update `Signup` to require an explicit `CompanyCode` choice for internal domains, removing automatic provisioning and implicit tenant assignment. - Add markdown diagram detailing the revised, secure B2B2B dynamic provisioning and inheritance flow.
60 lines
3.1 KiB
Markdown
60 lines
3.1 KiB
Markdown
# 가족사 테넌트 가입 및 관리 정책 (인증 기반 수정안)
|
|
|
|
이 문서는 보안 강화를 위해 **이메일 인증 성공 시에만 가족사 소속을 선택**할 수 있도록 변경된 가입 흐름을 설명합니다.
|
|
|
|
## 회원가입 및 권한 관리 흐름도
|
|
|
|
```mermaid
|
|
graph TD
|
|
%% 시작점
|
|
A([사용자 회원가입 시작]) --> B[이메일 입력 및 인증 코드 발송]
|
|
B --> C{이메일 인증 성공?}
|
|
|
|
C -- No --> B
|
|
C -- Yes --> D{인증된 이메일이<br>내부/가족사 도메인인가?}
|
|
|
|
%% 일반 도메인 (gmail, naver 등)
|
|
D -- No<br>(External) --> E[개인 테넌트 자동 할당<br>Type: PERSONAL]
|
|
E --> J
|
|
|
|
%% 내부 도메인 (hanmaceng.co.kr 등)
|
|
D -- Yes<br>(Internal) --> F[가족사 목록 노출 및 선택<br>Select Company Code]
|
|
F --> G{선택한 코드가<br>ACTIVE 상태인가?}
|
|
|
|
G -- No --> F
|
|
G -- Yes --> J[Ory Kratos 계정 생성]
|
|
|
|
%% 유저 생성 및 권한 할당
|
|
J --> K[(Local DB 유저 레코드 생성)]
|
|
K --> N[기본 권한 할당: user<br>Keto: members 부여]
|
|
|
|
N --> O([회원가입 완료])
|
|
|
|
%% 관리자 수동 개입 (별도 흐름)
|
|
P((최고 관리자<br>Super Admin)) -.-> Q[사용자 역할 변경<br>user -> tenant_admin]
|
|
Q -.-> R[(Keto 권한 수동 할당<br>owners, admins 부여)]
|
|
|
|
%% 스타일링
|
|
classDef process fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
|
|
classDef decision fill:#fff3e0,stroke:#e65100,stroke-width:2px;
|
|
classDef db fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px;
|
|
classDef startend fill:#f3e5f5,stroke:#4a148c,stroke-width:2px;
|
|
classDef admin fill:#f5f5f5,stroke:#616161,stroke-width:2px,stroke-dasharray: 5 5;
|
|
|
|
class A,O startend;
|
|
class B,F,J,N,Q process;
|
|
class C,D,G decision;
|
|
class E,K,R db;
|
|
class P admin;
|
|
```
|
|
|
|
## 핵심 정책 변경 사항
|
|
|
|
1. **선(先)인증 후(後)선택:** 사용자는 이메일 소유권 인증(OTP 또는 인증 링크)을 완료하기 전까지는 어떠한 가족사 소속도 선택할 수 없습니다.
|
|
2. **도메인 기반 노출 제어:**
|
|
- 인증된 이메일 도메인이 시스템에 등록된 가족사 도메인(`hanmaceng.co.kr` 등)일 경우에만 소속 선택 UI가 활성화됩니다.
|
|
- 일반 외부 도메인(gmail, naver 등)은 `PERSONAL` 테넌트로 강제 배정되어 가족사 리스트 자체가 노출되지 않습니다.
|
|
3. **이메일 도메인 중복 방지:** 같은 도메인을 쓰더라도 다른 소속일 수 있는 경우(예: 협력사 등)를 대비하여, 인증 성공 후에도 사용자가 직접 본인의 정확한 소속(`Company Code`)을 선택하게 하여 데이터 무결성을 확보합니다.
|
|
4. **수동 권한 위임 유지:** 모든 가입자는 기본적으로 `user` 권한을 부여받으며, 테넌트 관리자(`tenant_admin`)나 오너(`owner`) 권한은 지주사 관리자가 사용자의 신원을 최종 확인한 후 수동으로 부여합니다.
|
|
5. **실시간 상태 검증:** 가입 시점에 선택한 테넌트가 `ACTIVE` 상태가 아닐 경우 가입 진행을 차단합니다.
|