diff --git a/CURRENT_WORKS.md b/CURRENT_WORKS.md index 3d972e85..382563cc 100644 --- a/CURRENT_WORKS.md +++ b/CURRENT_WORKS.md @@ -1508,3 +1508,82 @@ ### Git 커밋: - 17 files changed, 1476 insertions(+), 4 deletions(-) --- + +## 2025-12-01 (일) - 사용자 비밀번호 자동 생성 및 이메일 발송 기능 + +### 주요 작업 +- 사용자 등록 시 비밀번호 입력 필드 제거 → 임의 비밀번호 자동 생성 후 이메일 발송 +- 사용자 수정 페이지에 비밀번호 초기화 버튼 추가 +- 사용자 모달에 비밀번호 초기화 버튼 추가 +- 사용자 모달 프로필 이미지 없을 때 이름 첫글자 표시 (한글 지원: `mb_strtoupper`) + +### 추가된 파일: + +#### Mail +- `app/Mail/UserPasswordMail.php` - 비밀번호 알림 Mailable 클래스 + - 신규 사용자 / 비밀번호 초기화 구분 (`$isNewUser`) + - 제목: `[SAM] 계정이 생성되었습니다` / `[SAM] 비밀번호가 초기화되었습니다` + +- `resources/views/emails/user-password.blade.php` - 이메일 템플릿 + - 스타일링된 HTML 이메일 + - 사용자 이름, 이메일, 임시 비밀번호 표시 + - 첫 로그인 후 비밀번호 변경 안내 + +### 수정된 파일: + +#### Service +- `app/Services/UserService.php` + - `createUser()`: 비밀번호 자동 생성 + 이메일 발송 + - `resetPassword()`: 비밀번호 초기화 + 이메일 발송 (신규 메서드) + - `generateRandomPassword()`: 8자리 임의 비밀번호 생성 (혼동 문자 제외: 0, O, l, 1, I) + - `sendPasswordMail()`: 이메일 발송 헬퍼 메서드 + +#### Controller +- `app/Http/Controllers/Api/Admin/UserController.php` + - `resetPassword()`: 비밀번호 초기화 엔드포인트 추가 + - 슈퍼관리자 보호: 일반 관리자가 슈퍼관리자 비밀번호 초기화 불가 + +#### Request +- `app/Http/Requests/StoreUserRequest.php` + - password 필드 검증 주석 처리 (자동 생성으로 변경) + +#### Routes +- `routes/api.php` + - `POST /api/admin/users/{id}/reset-password` 라우트 추가 + +#### Views +- `resources/views/users/create.blade.php` + - 비밀번호 입력 필드 제거 → 안내 메시지 표시 + - "임시 비밀번호가 생성되어 사용자 이메일로 발송됩니다" + +- `resources/views/users/edit.blade.php` + - 비밀번호 입력 필드 제거 → 초기화 버튼으로 변경 + - HTMX 대신 Fetch API 사용 (버튼 상태 관리) + +- `resources/views/users/partials/modal-info.blade.php` + - 프로필 이미지 없을 때: `strtoupper(substr())` → `mb_strtoupper(mb_substr())` (한글 지원) + - 비밀번호 초기화 버튼 추가 (삭제된 사용자 제외) + +#### JavaScript +- `public/js/user-modal.js` + - `resetPassword()`: 비밀번호 초기화 메서드 추가 + - confirm 다이얼로그 후 API 호출 + +### API 엔드포인트: +- `POST /api/admin/users/{id}/reset-password` + - 성공: `{ success: true, message: "비밀번호가 초기화되어 이메일로 발송되었습니다." }` + - 실패 (슈퍼관리자 보호): `{ success: false, message: "슈퍼관리자의 비밀번호는 초기화할 수 없습니다." }` + +### 이메일 설정: +- Gmail SMTP 사용 (`smtp.gmail.com:587`) +- Google Groups 이메일 발신자 지원 (Gmail "다른 주소에서 메일 보내기" 설정 필요) +- 설정 가이드: `docs/SETUP_GUIDE.md` 참조 + +### 코드 품질: +- ✅ Laravel Pint 통과 +- ✅ PHP 문법 검사 통과 + +### Git 커밋: +- ✅ `85cbe23` "feat: [users] 사용자 등록 시 비밀번호 자동 생성 및 이메일 발송" + +--- diff --git a/docs/INDEX.md b/docs/INDEX.md index f8557cd6..824c87c2 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -275,8 +275,17 @@ ## 📝 작업 이력 - 문서: MNG_CRITICAL_RULES.md, TROUBLESHOOTING.md 추가 - **Phase 4 완료**: 시스템 관리 메뉴 5개 완성 (60+ 파일, 5,000+ 줄) +**2025-12-01 (일)** +- 사용자 관리 비밀번호 기능 개선 + - 사용자 생성: 비밀번호 입력 제거 → 자동 생성 후 이메일 발송 + - 사용자 수정: 비밀번호 변경 → 비밀번호 초기화 버튼으로 대체 + - 사용자 모달: 비밀번호 초기화 버튼 추가 +- Gmail SMTP 이메일 설정 (Google Groups 발신자) +- 프로필 이미지 없을 때 이름 첫 글자 표시 (한글 지원: mb_* 함수) +- 문서: SETUP_GUIDE.md 이메일 설정 섹션 추가 + --- -**최종 업데이트**: 2025-11-24 +**최종 업데이트**: 2025-12-01 **버전**: 2.0 **상태**: Phase 4 완료, Phase 5 준비 중 \ No newline at end of file diff --git a/docs/SETUP_GUIDE.md b/docs/SETUP_GUIDE.md index 7540c6a9..1d22a058 100644 --- a/docs/SETUP_GUIDE.md +++ b/docs/SETUP_GUIDE.md @@ -80,8 +80,38 @@ ### Step 2: 환경 변수 설정 SESSION_DRIVER=file SANCTUM_STATEFUL_DOMAINS=mng.sam.kr + +# 이메일 설정 (Gmail SMTP) +MAIL_MAILER=smtp +MAIL_HOST=smtp.gmail.com +MAIL_PORT=587 +MAIL_USERNAME=your-email@gmail.com +MAIL_PASSWORD=your-app-password +MAIL_ENCRYPTION=tls +MAIL_FROM_ADDRESS=your-email@gmail.com +MAIL_FROM_NAME="${APP_NAME}" ``` +### 이메일 설정 (Gmail SMTP) + +사용자 등록 시 임시 비밀번호 발송, 비밀번호 초기화 등 이메일 기능을 사용하려면 SMTP 설정이 필요합니다. + +**Gmail 앱 비밀번호 발급:** +1. Google 계정 → 보안 → 2단계 인증 활성화 +2. 앱 비밀번호 생성 (https://myaccount.google.com/apppasswords) +3. 생성된 16자리 비밀번호를 `MAIL_PASSWORD`에 입력 + +**Google Groups 이메일 사용 (발신자 변경):** +- Google Groups 이메일(예: `develop@company.com`)을 발신자로 사용하려면: +1. Gmail 설정 → 계정 및 가져오기 → 다른 주소에서 메일 보내기 +2. 그룹 이메일 주소 추가 및 인증 +3. `.env`의 `MAIL_FROM_ADDRESS`를 그룹 이메일로 설정 + +**주의사항:** +- `MAIL_USERNAME`은 실제 Gmail 계정 (SMTP 인증용) +- `MAIL_FROM_ADDRESS`는 발신자 표시 주소 (Gmail에서 "다른 주소에서 메일 보내기" 설정 필요) +- 앱 비밀번호는 일반 비밀번호가 아닌 Google에서 생성한 16자리 코드 + ### Step 3: Tailwind + DaisyUI 설정 **mng/tailwind.config.js**