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 잠김 여부 *