diff --git a/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java b/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java index 8c8aa29..f2f39c7 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/facade/OrgRegisterFacadeImpl.java @@ -262,9 +262,10 @@ public class OrgRegisterFacadeImpl implements OrgRegisterFacade { // PortalOrgService를 통한 기관 등록 PortalOrg newOrg = portalOrgService.registerOrgFromDTOWithFile(orgDTO, uploadedFile); - // 새 사용자 생성 - existingUser.setLoginId(newEmail); - existingUser.setEmailAddr(newEmail); + // 새 사용자 생성 (이메일 소문자 변환 적용) + String normalizedNewEmail = newEmail != null ? newEmail.toLowerCase() : null; + existingUser.setLoginId(normalizedNewEmail); + existingUser.setEmailAddr(normalizedNewEmail); existingUser.setPortalOrg(newOrg); existingUser.setRoleCode(PortalUserEnums.RoleCode.ROLE_CORP_MANAGER); existingUser.setUserStatus(PortalUserEnums.UserStatus.READY); diff --git a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java index 1c84d81..b95b60e 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserAuthService.java @@ -55,7 +55,9 @@ public class PortalUserAuthService implements UserDetailsService { @Transactional(noRollbackFor = UsernameNotFoundException.class) public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { try { - PortalUser portalUser = findByEmailAddr(username); + // 이메일 소문자 변환 적용 (대소문자 구분 없이 로그인 가능하도록) + String normalizedUsername = username != null ? username.toLowerCase() : null; + PortalUser portalUser = findByEmailAddr(normalizedUsername); RoleCode userRole = portalUser.getRoleCode() == null ? RoleCode.ROLE_USER : portalUser.getRoleCode(); List roles = portalProperties.getPortalSecurity().get(userRole); PortalAuthenticatedUser authenticatedUser = portalUserMapper.portalUserToAuthenticatedUser(portalUser); diff --git a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java index d8b17c5..20921e5 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/service/PortalUserService.java @@ -46,11 +46,15 @@ public class PortalUserService { } public Optional findByLoginId(String loginId) { - return portalUserRepository.findByLoginId(loginId); + // 이메일 소문자 변환 적용 + String normalizedLoginId = loginId != null ? loginId.toLowerCase() : null; + return portalUserRepository.findByLoginId(normalizedLoginId); } public PortalUser findByEmailAddr(String emailAddr) { - return portalUserRepository.findPortalUserByEmailAddr(emailAddr) + // 이메일 소문자 변환 적용 + String normalizedEmail = emailAddr != null ? emailAddr.toLowerCase() : null; + return portalUserRepository.findPortalUserByEmailAddr(normalizedEmail) .orElseThrow(() -> new IllegalArgumentException("해당 이메일 주소의 사용자를 찾을 수 없습니다.")); } @@ -59,7 +63,9 @@ public class PortalUserService { } public boolean existsByLoginId(String loginId) { - return portalUserRepository.existsByLoginId(loginId); + // 이메일 소문자 변환 적용 + String normalizedLoginId = loginId != null ? loginId.toLowerCase() : null; + return portalUserRepository.existsByLoginId(normalizedLoginId); } public boolean checkOrgHasOtherUsers(PortalOrg portalOrg) { @@ -137,11 +143,13 @@ public class PortalUserService { } private void mapDtoToEntity(PortalUser user, PortalUserRegistrationDTO dto) { - user.setLoginId(dto.getLoginId()); + // 이메일 소문자 변환 적용 (대소문자 구분 없이 로그인 가능하도록) + String normalizedEmail = dto.getLoginId() != null ? dto.getLoginId().toLowerCase() : null; + user.setLoginId(normalizedEmail); user.setUserName(dto.getUserName()); user.setPasswordHash(passwordEncoder.encode(dto.getPassword())); user.setMobileNumber(dto.getMobileNumber()); - user.setEmailAddr(dto.getLoginId()); + user.setEmailAddr(normalizedEmail); } /** @@ -176,7 +184,9 @@ public class PortalUserService { } public boolean checkPassword(String loginId, String inputPassword) { - PortalUser user = portalUserRepository.findByLoginId(loginId) + // 이메일 소문자 변환 적용 + String normalizedLoginId = loginId != null ? loginId.toLowerCase() : null; + PortalUser user = portalUserRepository.findByLoginId(normalizedLoginId) .orElseThrow(() -> new IllegalArgumentException("해당 사용자를 찾을 수 없습니다.")); return passwordEncoder.matches(inputPassword, user.getPasswordHash()); } diff --git a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java index c6d6f2e..8b9b684 100644 --- a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java +++ b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationFailureHandler.java @@ -49,6 +49,8 @@ public class PortalAuthenticationFailureHandler implements AuthenticationFailure @Transactional(propagation = Propagation.REQUIRES_NEW, noRollbackFor = {AuthenticationException.class, UserNotFoundException.class}) public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException { String username = request.getParameter("id"); + // 이메일 소문자 변환 적용 + String normalizedUsername = username != null ? username.toLowerCase() : null; String ip = request.getRemoteAddr(); String sessionId = request.getSession().getId(); @@ -56,8 +58,8 @@ public class PortalAuthenticationFailureHandler implements AuthenticationFailure logger.error(exception.getLocalizedMessage()); } else if (!(exception instanceof UsernameNotFoundException)) { try { - PortalUser user = portalUserRepository.findPortalUserByEmailAddr(username) - .orElseThrow(() -> new UserNotFoundException(username)); + PortalUser user = portalUserRepository.findPortalUserByEmailAddr(normalizedUsername) + .orElseThrow(() -> new UserNotFoundException(normalizedUsername)); user.setLoginFailureCount(user.getLoginFailureCount() + 1); if (user.getLoginFailureCount() >= 5) { diff --git a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java index 736e4f8..0510d8c 100644 --- a/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java +++ b/src/main/java/com/eactive/apim/portal/config/PortalAuthenticationSuccessHandler.java @@ -46,7 +46,9 @@ public class PortalAuthenticationSuccessHandler implements AuthenticationSuccess public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { String username = request.getParameter("id"); - PortalUser user = portalUserRepository.findPortalUserByEmailAddr(username).orElse(null); + // 이메일 소문자 변환 적용 + String normalizedUsername = username != null ? username.toLowerCase() : null; + PortalUser user = portalUserRepository.findPortalUserByEmailAddr(normalizedUsername).orElse(null); if (user == null) { response.sendRedirect(request.getContextPath() + "/login?error=true"); return; diff --git a/src/main/resources/templates/views/apps/login/login.html b/src/main/resources/templates/views/apps/login/login.html index be4210b..fb159ca 100644 --- a/src/main/resources/templates/views/apps/login/login.html +++ b/src/main/resources/templates/views/apps/login/login.html @@ -160,6 +160,9 @@ // Show loading state $('#loginLoading').addClass('active'); + // 이메일(아이디) 소문자 변환 적용 + form.id.value = form.id.value.toLowerCase(); + if ($('#checkId').is(':checked')) { setCookie('saveid', $('#id').val(), new Date(new Date().getTime() + 1000 * 3600 * 24 * 30)); } else { diff --git a/src/main/resources/templates/views/apps/register/components/commonUserInfoForm.html b/src/main/resources/templates/views/apps/register/components/commonUserInfoForm.html index 8024b4b..c2c8592 100644 --- a/src/main/resources/templates/views/apps/register/components/commonUserInfoForm.html +++ b/src/main/resources/templates/views/apps/register/components/commonUserInfoForm.html @@ -39,10 +39,10 @@