fix(core,admin_basic,board,ecommerce,page,gdpr,verification): 설정 미러·자동 정리·탈퇴 원자성·일괄 선택 범위 정비
공개이슈 ··· 및 그 전수 해소분. - 설정 저장·복원·초기화가 상주 프로세스 미러를 갱신하도록 단일 소유자화 - 만료 데이터 자동 정리 예약 12종 신설, 파기는 기본키 배치로 분할 - 회원 탈퇴를 전 경로 원자화하고 관리자 상태변경 경로를 정식 탈퇴로 통일 - 일괄 처리 목록의 선택을 화면에 보이는 행으로 한정(selectionScope) - 비밀번호 정책 문구를 도메인 중립 라벨로 정정 - 정적 검사 2종·검증 스킬 설계 정합성 축 신설
This commit is contained in:
1 parent
49c155509e
commit
4e1ec6e001
136 files changed
+7016
-504
No files matched your search
@@ -15,6 +15,7 @@ use App\Extension\HookManager;
|
||||
use App\Models\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Str;
|
||||
@@ -347,19 +348,27 @@ class AuthService
|
||||
'status' => $status,
|
||||
];
|
||||
|
||||
$user = $this->userRepository->create($userData);
|
||||
// 계정 생성 이후 단계에서 실패하면 이메일만 점유한 유령 계정이 남아
|
||||
// 같은 이메일로 재가입조차 불가능해진다. 생성~토큰 발급을 하나로 묶는다.
|
||||
[$user, $token] = DB::transaction(function () use ($userData, $data, $now) {
|
||||
$user = $this->userRepository->create($userData);
|
||||
|
||||
// 약관 동의 이력 기록
|
||||
$this->recordConsents($user, $data, $now);
|
||||
// 약관 동의 이력 기록
|
||||
$this->recordConsents($user, $data, $now);
|
||||
|
||||
// 'user' 역할 자동 할당 (UserService 패턴과 동일)
|
||||
$userRole = $this->roleRepository->findByIdentifier('user');
|
||||
if ($userRole) {
|
||||
$user->roles()->sync([$userRole->id]);
|
||||
$user->flushPermissionCaches();
|
||||
}
|
||||
// 'user' 역할 자동 할당 (UserService 패턴과 동일)
|
||||
$userRole = $this->roleRepository->findByIdentifier('user');
|
||||
if ($userRole) {
|
||||
$user->roles()->sync([$userRole->id]);
|
||||
}
|
||||
|
||||
$token = $user->createToken('auth-token', ['*'], $this->getTokenExpiresAt())->plainTextToken;
|
||||
$token = $user->createToken('auth-token', ['*'], $this->getTokenExpiresAt())->plainTextToken;
|
||||
|
||||
return [$user, $token];
|
||||
});
|
||||
|
||||
// 커밋 후 부수효과 (캐시는 DB 트랜잭션의 롤백 대상이 아니다)
|
||||
$user->flushPermissionCaches();
|
||||
|
||||
// Hook 발생 (회원가입 완료) — 알림 발송은 NotificationHookListener,
|
||||
// signup_after_create 정책이 enabled 면 InitiateIdentityChallengeAfterRegister 가 challenge 발행.
|
||||
@@ -612,16 +621,20 @@ class AuthService
|
||||
]);
|
||||
}
|
||||
|
||||
// Hook 발생 (비밀번호 재설정 시작)
|
||||
HookManager::doAction('core.auth.before_reset_password', $user);
|
||||
// 비밀번호를 바꾼 뒤 토큰 삭제가 실패하면 그 재설정 토큰이 계속 유효한 채로
|
||||
// 남아 재사용된다(보안). 두 단계를 하나로 묶는다.
|
||||
DB::transaction(function () use ($user, $password, $record) {
|
||||
// Hook 발생 (비밀번호 재설정 시작)
|
||||
HookManager::doAction('core.auth.before_reset_password', $user);
|
||||
|
||||
// 비밀번호 업데이트
|
||||
$this->userRepository->update($user, [
|
||||
'password' => Hash::make($password),
|
||||
]);
|
||||
// 비밀번호 업데이트
|
||||
$this->userRepository->update($user, [
|
||||
'password' => Hash::make($password),
|
||||
]);
|
||||
|
||||
// 사용된 토큰 삭제
|
||||
$record->delete();
|
||||
// 사용된 토큰 삭제
|
||||
$record->delete();
|
||||
});
|
||||
|
||||
// Hook 발생 (비밀번호 변경 완료) — 알림 발송은 NotificationHookListener가 처리
|
||||
HookManager::doAction('core.auth.after_password_changed', $user);
|
||||
|
||||
Reference in new issue
Block a user