添加密码状态检查

This commit is contained in:
WenG 2021-03-01 13:36:17 +08:00
parent edbc02bbaf
commit 920874a82d
6 changed files with 126 additions and 9 deletions

View File

@ -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<String> getPasswordStatus(ISystemConfigManager systemConfigManager);
}

View File

@ -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<String> getPasswordStatus() throws ReflectUtil.ReflectException {
ISystemConfigManager systemConfigManager = ReflectUtil.getSingleInstance("ink.wgink.login.base.manager.ConfigManager", ISystemConfigManager.class);
return userService.getPasswordStatus(systemConfigManager);
}
}

View File

@ -123,4 +123,12 @@ public interface IUserDao {
*/
Integer count(Map<String, Object> params) throws SearchException;
/**
* 密码修改时间
*
* @param userId
* @return
* @throws SearchException
*/
String getGmtPasswordModified(String userId) throws SearchException;
}

View File

@ -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";
/**
* 保存用户

View File

@ -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<String> getPasswordStatus(ISystemConfigManager systemConfigManager) {
if (systemConfigManager == null) {
return new SuccessResultData<>(PASSWORD_OK);
}
Map<String, Object> 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导入错误对象
*

View File

@ -456,4 +456,16 @@
</if>
</select>
<!-- 密码修改时间 -->
<select id="getGmtPasswordModified" parameterType="java.lang.String" resultType="java.lang.String">
SELECT
LEFT(gmt_password_modified, 19)
FROM
sys_user
WHERE
is_delete = 0
AND
user_id = #{userId}
</select>
</mapper>