diff --git a/basic-interface/src/main/java/ink/wgink/interfaces/user/IUserBaseService.java b/basic-interface/src/main/java/ink/wgink/interfaces/user/IUserBaseService.java index c3817234..4a0aa003 100644 --- a/basic-interface/src/main/java/ink/wgink/interfaces/user/IUserBaseService.java +++ b/basic-interface/src/main/java/ink/wgink/interfaces/user/IUserBaseService.java @@ -1,8 +1,10 @@ package ink.wgink.interfaces.user; +import ink.wgink.interfaces.manager.ISystemConfigManager; import ink.wgink.pojo.ListPage; import ink.wgink.pojo.dtos.department.DepartmentUserDTO; import ink.wgink.pojo.dtos.user.UserDTO; +import ink.wgink.pojo.result.SuccessResultData; import ink.wgink.pojo.result.SuccessResultList; import java.util.List; @@ -124,4 +126,12 @@ public interface IUserBaseService { * @return */ Integer countState(int userState); + + /** + * 获取密码状态 + * + * @param systemConfigManager + * @return + */ + SuccessResultData getPasswordStatus(ISystemConfigManager systemConfigManager); } diff --git a/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java b/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java index 064c3729..0d7ffc9d 100644 --- a/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java +++ b/service-user/src/main/java/ink/wgink/service/user/controller/api/UserController.java @@ -6,15 +6,12 @@ import ink.wgink.exceptions.ParamsException; import ink.wgink.interfaces.consts.IFileConstant; import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.interfaces.manager.ISystemConfigManager; +import ink.wgink.pojo.result.*; import ink.wgink.pojo.vos.IdsVO; import ink.wgink.service.user.pojo.vos.*; import ink.wgink.pojo.ListPage; import ink.wgink.pojo.dtos.user.UserDTO; -import ink.wgink.pojo.result.ErrorResult; -import ink.wgink.pojo.result.SuccessResult; -import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.service.user.service.IUserService; -import ink.wgink.pojo.result.UploadExcelResultDTO; import ink.wgink.util.ReflectUtil; import ink.wgink.util.RegexUtil; import io.swagger.annotations.*; @@ -219,4 +216,12 @@ public class UserController extends DefaultBaseController { return userService.listByUserIds(idsVO.getIds()); } + @ApiOperation(value = "获取密码状态", notes = "获取密码状态接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("get-password-status") + public SuccessResultData getPasswordStatus() throws ReflectUtil.ReflectException { + ISystemConfigManager systemConfigManager = ReflectUtil.getSingleInstance("ink.wgink.login.base.manager.ConfigManager", ISystemConfigManager.class); + return userService.getPasswordStatus(systemConfigManager); + } + } diff --git a/service-user/src/main/java/ink/wgink/service/user/dao/IUserDao.java b/service-user/src/main/java/ink/wgink/service/user/dao/IUserDao.java index 10abf6bc..647fd15e 100644 --- a/service-user/src/main/java/ink/wgink/service/user/dao/IUserDao.java +++ b/service-user/src/main/java/ink/wgink/service/user/dao/IUserDao.java @@ -123,4 +123,12 @@ public interface IUserDao { */ Integer count(Map params) throws SearchException; + /** + * 密码修改时间 + * + * @param userId + * @return + * @throws SearchException + */ + String getGmtPasswordModified(String userId) throws SearchException; } diff --git a/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java b/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java index 9b38cb16..9cdd6969 100644 --- a/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java +++ b/service-user/src/main/java/ink/wgink/service/user/service/IUserService.java @@ -26,6 +26,12 @@ import java.util.Map; */ public interface IUserService extends IUserBaseService, IUserCheckService { + /** + * 密码验证 + */ + String PASSWORD_VALIDITY_CUSTOM = "custom"; + String PASSWORD_VALIDITY_NONE = "none"; + String PASSWORD_VALIDITY = "passwordValidity"; /** * 密码强度 */ @@ -33,6 +39,23 @@ public interface IUserService extends IUserBaseService, IUserCheckService { String PASSWORD_STRENGTH_WEAK = "weak"; String PASSWORD_STRENGTH_MIDDLE = "middle"; String PASSWORD_STRENGTH_STRONG = "strong"; + /** + * 第一次登陆修改密码 + */ + String FIRST_LOGIN_CHANGE_PASSWORD = "firstLoginChangePassword"; + String FIRST_LOGIN_CHANGE_PASSWORD_OPEN = "open"; + String FIRST_LOGIN_CHANGE_PASSWORD_CLOSE = "close"; + /** + * 密码有效期 + */ + String PASSWORD_VALIDITY_DAYS = "passwordValidityDays"; + /** + * 密码提醒时间 + */ + String CHANGE_PASSWORD_NOTICE_DAYS = "changePasswordNoticeDays"; + String PASSWORD_OK = "ok"; + String PASSWORD_CHANGE = "change"; + String PASSWORD_REMIND = "remind"; /** * 保存用户 diff --git a/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java b/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java index 6590fc3d..9521b6f6 100644 --- a/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java +++ b/service-user/src/main/java/ink/wgink/service/user/service/impl/UserServiceImpl.java @@ -6,8 +6,15 @@ import com.github.pagehelper.PageInfo; import ink.wgink.common.base.DefaultBaseService; import ink.wgink.exceptions.SearchException; import ink.wgink.exceptions.UpdateException; +import ink.wgink.interfaces.consts.ISystemConstant; +import ink.wgink.interfaces.manager.ISystemConfigManager; import ink.wgink.module.file.excel.error.AbstractErrorExcelHandler; import ink.wgink.module.file.service.IFileService; +import ink.wgink.pojo.ListPage; +import ink.wgink.pojo.dtos.user.UserDTO; +import ink.wgink.pojo.result.SuccessResultData; +import ink.wgink.pojo.result.SuccessResultList; +import ink.wgink.pojo.result.UploadExcelResultDTO; import ink.wgink.service.user.dao.IUserDao; import ink.wgink.service.user.enums.UserUpdateTypeEnum; import ink.wgink.service.user.excel.UserExcel; @@ -18,18 +25,15 @@ import ink.wgink.service.user.pojo.pos.UserPO; import ink.wgink.service.user.pojo.vos.*; import ink.wgink.service.user.service.IUserAdjustmentService; import ink.wgink.service.user.service.IUserService; -import ink.wgink.pojo.ListPage; -import ink.wgink.pojo.dtos.user.UserDTO; -import ink.wgink.pojo.result.SuccessResultList; -import ink.wgink.pojo.result.UploadExcelResultDTO; import ink.wgink.util.UUIDUtil; import ink.wgink.util.date.DateUtil; import ink.wgink.util.map.HashMapUtil; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; +import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -360,6 +364,61 @@ public class UserServiceImpl extends DefaultBaseService implements IUserService return count(params); } + @Override + public SuccessResultData getPasswordStatus(ISystemConfigManager systemConfigManager) { + if (systemConfigManager == null) { + return new SuccessResultData<>(PASSWORD_OK); + } + Map config = systemConfigManager.getConfig(); + String passwordValidity = PASSWORD_VALIDITY_CUSTOM; + if (config.get(PASSWORD_VALIDITY) != null && !StringUtils.isBlank(config.get(PASSWORD_VALIDITY).toString())) { + passwordValidity = config.get(PASSWORD_VALIDITY).toString(); + } + // 密码永不过期 + if (StringUtils.equals(PASSWORD_VALIDITY_NONE, passwordValidity)) { + return new SuccessResultData<>(PASSWORD_OK); + } + String firstLoginChangePassword = FIRST_LOGIN_CHANGE_PASSWORD_CLOSE; + if (config.get(FIRST_LOGIN_CHANGE_PASSWORD) != null && !StringUtils.isBlank(config.get(FIRST_LOGIN_CHANGE_PASSWORD).toString())) { + firstLoginChangePassword = config.get(FIRST_LOGIN_CHANGE_PASSWORD).toString(); + } + String gmtPasswordModified = userDao.getGmtPasswordModified(securityComponent.getCurrentUser().getUserId()); + if (StringUtils.equals(FIRST_LOGIN_CHANGE_PASSWORD_OPEN, firstLoginChangePassword) && StringUtils.isBlank(gmtPasswordModified)) { + return new SuccessResultData<>(PASSWORD_CHANGE); + } + DateTime gmtPasswordModifiedDateTime = null; + if (!StringUtils.isBlank(gmtPasswordModified)) { + gmtPasswordModifiedDateTime = DateTime.parse(gmtPasswordModified, DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)); + } + // 密码有效时间 + int passwordValidityDays = 90; + if (config.get(PASSWORD_VALIDITY_DAYS) != null && StringUtils.isBlank(config.get(PASSWORD_VALIDITY_DAYS).toString())) { + passwordValidityDays = Integer.parseInt(config.get(PASSWORD_VALIDITY_DAYS).toString()); + } + if (gmtPasswordModifiedDateTime == null) { + return new SuccessResultData<>(PASSWORD_CHANGE); + } + DateTime nowDate = DateTime.now(); + // 到期时间 + DateTime expireGmtPasswordModifiedDateTime = gmtPasswordModifiedDateTime.plusDays(passwordValidityDays); + if (expireGmtPasswordModifiedDateTime.compareTo(nowDate) <= 0) { + return new SuccessResultData<>(PASSWORD_CHANGE); + } + // 提醒修改密码时间 + int changePasswordNoticeDays = 14; + if (config.get(CHANGE_PASSWORD_NOTICE_DAYS) != null && StringUtils.isBlank(config.get(CHANGE_PASSWORD_NOTICE_DAYS).toString())) { + changePasswordNoticeDays = Integer.parseInt(config.get(CHANGE_PASSWORD_NOTICE_DAYS).toString()); + } + if (changePasswordNoticeDays >= passwordValidityDays) { + return new SuccessResultData<>(PASSWORD_OK); + } + DateTime noticeDateTime = expireGmtPasswordModifiedDateTime.minusDays(changePasswordNoticeDays); + if (noticeDateTime.compareTo(nowDate) <= 0) { + return new SuccessResultData<>(PASSWORD_REMIND); + } + return new SuccessResultData<>(PASSWORD_OK); + } + /** * Excel导入错误对象 * diff --git a/service-user/src/main/resources/mybatis/mapper/user-mapper.xml b/service-user/src/main/resources/mybatis/mapper/user-mapper.xml index 3414e72f..152d7ed4 100644 --- a/service-user/src/main/resources/mybatis/mapper/user-mapper.xml +++ b/service-user/src/main/resources/mybatis/mapper/user-mapper.xml @@ -456,4 +456,16 @@ + + + \ No newline at end of file