forked from baron/baron-sso
feat: 커스텀 필드 기반 로그인 ID 연동 기능 추가 (#440)
- Kratos Identity 스키마에 로그인 전용 `id` 속성 추가 - 테넌트 Config의 `loginIdField` 설정에 따라 User의 `login_id` 및 Kratos `traits.id` 동기화 로직 구현 - Admin UI 테넌트 스키마 설정 내 '로그인 ID로 사용' 체크박스 추가 - Admin UI 사용자 생성/수정/조회 화면에 로그인 ID 관리 필드 및 컬럼 반영 - Userfront 로그인 화면 접속 시 테넌트 설정에 따라 동적 로그인 ID 라벨 적용 - 관련 다국어(ko/en) 번역 추가 및 로그인 ID 설계 문서 업데이트
This commit is contained in:
53
docs/employee_id_login_db_design.md
Normal file
53
docs/employee_id_login_db_design.md
Normal file
@@ -0,0 +1,53 @@
|
||||
# 커스텀 필드 기반 로그인 ID 연동 - DB 설계 문서
|
||||
|
||||
## 1. 개요
|
||||
본 문서는 사용자(User) 정보에 범용 로그인 ID(`login_id`)를 추가하고, 이를 테넌트별 설정에 따라 커스텀 필드와 동기화하기 위한 **데이터베이스(DB) 관점의 설계 변경 사항**을 명세합니다.
|
||||
|
||||
## 2. DB 스키마 변경 사항
|
||||
|
||||
### 2.1. 대상 테이블: `users`
|
||||
|
||||
현재 백엔드(PostgreSQL)의 `users` 테이블에 `login_id` 컬럼을 추가합니다.
|
||||
|
||||
| 컬럼명 | 타입 | 제약 조건 | 설명 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| `login_id` | `VARCHAR(255)` | `NULL` 허용 | 범용 로그인 식별자 (사번, 학번 등) |
|
||||
|
||||
#### 인덱스(Index) 설정
|
||||
단순 `unique`가 아닌, **테넌트 내 고유성**을 보장하기 위해 `tenant_id`와 조합된 복합 유니크 인덱스를 생성합니다.
|
||||
* **인덱스명**: `idx_tenant_login_id`
|
||||
* **구성 컬럼**: `(tenant_id, login_id)`
|
||||
* **효과**:
|
||||
* 서로 다른 테넌트 간에는 동일한 `login_id`가 존재할 수 있습니다.
|
||||
* 동일 테넌트 내에서는 중복된 `login_id`를 가질 수 없습니다.
|
||||
|
||||
### 2.2. 대상 테이블: `tenants`
|
||||
|
||||
`tenants` 테이블의 `config` (JSONB) 컬럼에 매핑 설정을 추가합니다.
|
||||
|
||||
* **설정 키**: `loginIdField`
|
||||
* **설명**: 사용자의 `metadata` (커스텀 필드) 중 어떤 필드의 값을 `login_id`로 동기화할지 결정하는 필드 키 이름입니다.
|
||||
* **예시**: `"loginIdField": "emp_no"`
|
||||
|
||||
## 3. 데이터 흐름 및 동기화
|
||||
|
||||
### 3.1. 사용자 생성/수정 (Sync Flow)
|
||||
1. 사용자 생성/수정 시 전달된 `metadata`와 테넌트의 `config.loginIdField`를 확인합니다.
|
||||
2. `metadata` 내에 해당 키의 값이 존재하면, 그 값을 `users.login_id` 컬럼에 저장합니다.
|
||||
3. 동시에 Ory Kratos의 `traits.id` 필드에도 해당 값을 업데이트하여 Kratos를 통한 로그인을 가능하게 합니다.
|
||||
|
||||
### 3.2. 대량 업로드 (Bulk Import)
|
||||
1. CSV/Excel 파일의 컬럼 중 테넌트에서 지정한 커스텀 필드 컬럼(예: 사번)을 파싱합니다.
|
||||
2. 위의 동기화 로직과 동일하게 `login_id` 컬럼과 Kratos Traits를 업데이트합니다.
|
||||
|
||||
## 4. GORM 모델 반영 (Go)
|
||||
|
||||
```go
|
||||
type User struct {
|
||||
ID string `gorm:"primaryKey;type:uuid"`
|
||||
Email string `gorm:"uniqueIndex;not null"`
|
||||
LoginID string `gorm:"column:login_id;uniqueIndex:idx_tenant_login_id"`
|
||||
TenantID *string `gorm:"column:tenant_id;type:uuid;uniqueIndex:idx_tenant_login_id"`
|
||||
// ... 기타 필드
|
||||
}
|
||||
```
|
||||
47
docs/employee_id_login_design.md
Normal file
47
docs/employee_id_login_design.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# 커스텀 필드 기반 로그인 ID 연동 설계 문서 (구 사번 로그인)
|
||||
|
||||
## 1. 개요
|
||||
기존에 고정된 사번(`employee_id`) 필드를 사용하려던 설계를 변경하여, 테넌트별로 지정한 **커스텀 필드**를 실제 로그인 식별자로 사용할 수 있도록 하는 범용적인 로그인 ID 체계를 구축합니다.
|
||||
|
||||
## 2. 시스템별 변경 사항
|
||||
|
||||
### 2.1. Ory Kratos (인증 서버)
|
||||
* **Identity Schema**: `traits` 내에 `id` 필드를 추가합니다.
|
||||
* **Identifier 설정**: `traits.id`를 `credentials.password.identifier`로 설정하여 로그인 시 식별자로 사용할 수 있게 합니다.
|
||||
* **특징**: 이 필드는 '사번', '학번', 'ID' 등 테넌트의 성격에 따라 다양한 용도로 활용되는 범용 식별자 역할을 합니다.
|
||||
|
||||
### 2.2. Backend (baron-sso-backend)
|
||||
|
||||
#### 데이터 모델 (`domain.User`)
|
||||
* `login_id` (string) 컬럼 추가.
|
||||
* `idx_tenant_login_id` 복합 유니크 인덱스 생성: `(tenant_id, login_id)`.
|
||||
|
||||
#### 테넌트 설정 (`domain.Tenant`)
|
||||
* `Config` 내에 `loginIdField` 설정을 추가합니다.
|
||||
* 이 설정은 해당 테넌트의 `userSchema` 중 어떤 필드(key)가 로그인 ID로 사용될지를 저장합니다.
|
||||
|
||||
#### 동기화 로직 (`UserHandler`)
|
||||
* **사용자 생성/수정 시**:
|
||||
1. 테넌트의 `loginIdField` 설정을 조회합니다.
|
||||
2. 설정된 필드가 있다면 사용자의 `Metadata`에서 해당 값을 추출합니다.
|
||||
3. 추출된 값을 Kratos의 `traits.id`와 로컬 DB의 `login_id` 컬럼에 동기화합니다.
|
||||
* **대량 등록 (Bulk Import)**: CSV/JSON 업로드 시에도 동일한 동기화 로직이 적용됩니다.
|
||||
|
||||
### 2.3. Frontend (adminfront)
|
||||
|
||||
#### 테넌트 스키마 관리 (`TenantSchemaPage`)
|
||||
* 커스텀 필드 정의 시 "로그인 ID로 사용" 체크박스를 추가합니다.
|
||||
* 이 체크박스를 선택하면 해당 필드의 `key`가 테넌트 `Config.loginIdField`에 저장됩니다.
|
||||
|
||||
#### 사용자 관리 (`UserCreatePage`, `UserDetailPage`)
|
||||
* 기본 정보 영역에 "로그인 ID" 필드를 노출하여 직접 관리할 수 있게 합니다.
|
||||
|
||||
### 2.4. Frontend (userfront)
|
||||
|
||||
#### 로그인 페이지 (`LoginScreen`)
|
||||
* URL의 `companyCode` 또는 도메인을 통해 테넌트를 식별합니다.
|
||||
* 해당 테넌트에 `loginIdField`가 설정되어 있다면, 로그인 입력란의 라벨을 해당 커스텀 필드의 라벨(예: "사번")로 동적으로 변경합니다.
|
||||
|
||||
## 3. 기대 효과
|
||||
* 테넌트별로 상이한 로그인 식별자 요구사항(사번, 학생번호, 커스텀 ID 등)을 코드 수정 없이 유연하게 수용할 수 있습니다.
|
||||
* 이메일, 전화번호 외의 추가적인 로그인 수단을 제공하여 사용자 편의성을 높입니다.
|
||||
Reference in New Issue
Block a user