From 3ffe2e6bb8a9eaf59a7e4a2a7165af0b55f5af0f Mon Sep 17 00:00:00 2001 From: mjkhan21 Date: Thu, 20 Jun 2024 14:52:33 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B9=84=EB=B0=80=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cokr/xit/base/user/dao/UserMapper.java | 6 ++-- .../xit/base/user/service/UserService.java | 11 +++++- .../xit/base/user/service/bean/UserBean.java | 34 +++++++++++++++++-- .../user/service/bean/UserServiceBean.java | 9 +++-- .../xit/base/user/web/UserController.java | 23 +++++++++++-- 5 files changed, 71 insertions(+), 12 deletions(-) diff --git a/src/main/java/cokr/xit/base/user/dao/UserMapper.java b/src/main/java/cokr/xit/base/user/dao/UserMapper.java index 86a965e..685691e 100644 --- a/src/main/java/cokr/xit/base/user/dao/UserMapper.java +++ b/src/main/java/cokr/xit/base/user/dao/UserMapper.java @@ -73,12 +73,10 @@ public interface UserMapper extends AbstractMapper { * @return 사용자 */ default T getUser(String account, String institute) { - notEmpty(account, "사용자 계정"); - notEmpty(institute, "소속 기관 코드"); return getUser( params() - .set("account", account) - .set("institute", institute) + .set("account", notEmpty(account, "사용자 계정")) + .set("institute", notEmpty(institute, "소속 기관 코드")) ); } diff --git a/src/main/java/cokr/xit/base/user/service/UserService.java b/src/main/java/cokr/xit/base/user/service/UserService.java index 720d009..2b7a641 100644 --- a/src/main/java/cokr/xit/base/user/service/UserService.java +++ b/src/main/java/cokr/xit/base/user/service/UserService.java @@ -87,11 +87,20 @@ public interface UserService { boolean update(User user); /**지정한 사용자들의 비밀번호를 변경한다. {@link cokr.xit.foundation.util.CharsEncoder 비밀번호는 암호화}하여 저장한다. + * @param init 비밀번호 초기화 여부 * @param password 새 비밀번호 * @param userIDs 사용자 아이디 * @return 저장된 정보수 */ - int changePassword(String password, String... userIDs); + int changePassword(boolean init, String password, String... userIDs); + + /**지정한 사용자의 비밀번호를 변경한다. {@link cokr.xit.foundation.util.CharsEncoder 비밀번호는 암호화}하여 저장한다. + * @param userID 사용자 아이디 + * @param currentPassword 현재 비밀번호 + * @param password 새 비밀번호 + * @return 저장된 정보수 + */ + int changePassword(String userID, String currentPassword, String password); /**지정한 사용자들을 잠금 또는 잠김해제한다. * @param lock 잠김 여부 diff --git a/src/main/java/cokr/xit/base/user/service/bean/UserBean.java b/src/main/java/cokr/xit/base/user/service/bean/UserBean.java index 6c07a1c..1e37912 100644 --- a/src/main/java/cokr/xit/base/user/service/bean/UserBean.java +++ b/src/main/java/cokr/xit/base/user/service/bean/UserBean.java @@ -1,6 +1,7 @@ package cokr.xit.base.user.service.bean; import java.util.List; +import java.util.Map; import javax.annotation.Resource; @@ -113,21 +114,50 @@ public class UserBean extends AbstractBean { User existing = getExistingUser(user); if (existing != null && !equals(user.getId(), existing.getId())) throw applicationException(null) - .setMessage(message("duplicate.object", "사용자")); + .setMessage(message("authenticationFailure.badCredentials")); user.setModifiedBy(currentUser().getId()); return userMapper.updateUser(user) > 0; } + private String defaultPassword() { + return properties.getString("defaultPassword"); + } + + /**지정한 암호화된 문자열이 디폴트 비밀번호와 같은지 반환한다. + * @param encrypted 암호화된 문자열 + * @return 지정한 암호화된 문자열이 디폴트 비밀번호와 같은지 여부 + */ + public boolean isDefaultPassword(String encrypted) { + String defaultPassword = defaultPassword(); + if (isEmpty(encrypted) + || isEmpty(defaultPassword)) + return false; + + return passwordEncoder.matches(defaultPassword, encrypted); + } + /**지정한 사용자들의 비밀번호를 변경한다. {@link cokr.xit.foundation.util.CharsEncoder 비밀번호는 암호화}하여 저장한다. + * @param init 비밀번호 초기화 여부 * @param password 새 비밀번호 * @param userIDs 사용자 아이디 * @return 저장된 정보수 */ - public int changePassword(String password, String... userIDs) { + public int changePassword(boolean init, String password, String... userIDs) { + if (init) { + password = defaultPassword(); + } return userMapper.changePassword(passwordEncoder.encode(password), userIDs); } + public int changePassword(String userID, String currentPassword, String password) { + User user = userMapper.getUser(Map.of("userID", userID)); + if (!passwordEncoder.matches(currentPassword, user.getPassword())) + return 0; + + return changePassword(false, password, userID); + } + /**지정한 사용자들을 잠금 또는 잠김해제한다. * @param lock 잠김 여부 *