diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java index 10405df..49d328c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserService.java @@ -4,6 +4,7 @@ import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.shirotoken.BaseToken; import cn.estsh.i3plus.pojo.platform.bean.*; +import cn.estsh.impp.framework.boot.util.ResultBean; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authc.AuthenticationException; @@ -27,7 +28,7 @@ public interface ISysUserService { * @return */ @ApiOperation(value = "账号登录", notes = "普通账号登录功能") - SessionUser loginUser(String loginName, String password, String languageCode, Integer loginPlatform, String deviceId) throws AuthenticationException; + ResultBean loginUser(String loginName, String password, String languageCode, Integer loginPlatform, String deviceId) throws AuthenticationException; @ApiOperation(value = "获取Token", notes = "根据登录名判断是否是管理员") BaseToken getToken(String loginName, String password, String languageCode, Integer loginPlatform); @@ -92,6 +93,23 @@ public interface ISysUserService { void refreshUserLoginInformation(Long userId); /** + * 首次登录重置账号登录次数 + * + * @param userId + */ + @ApiOperation(value = "首次登录重置账号登录次数", notes = "首次登录重置账号登录次数") + void updateUserLoginNum(Long userId,Integer userLoginNum); + + + /** + * 刷新账号登录时间信息 + * + * @param userId + */ + @ApiOperation(value = "刷新账号登录时间信息", notes = "刷新账号登录时间信息") + void refreshUserLoginDateTime(Long userId,Long userInfoId); + + /** * 新增账号信息 * * @param sysUser 新增账号 diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameUserAuthRealm.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameUserAuthRealm.java index 7d8b905..3f6f378 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameUserAuthRealm.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameUserAuthRealm.java @@ -46,6 +46,8 @@ public class NameUserAuthRealm extends AuthorizingRealm { //管理员令牌 SessionUser sessionUser = systemLoginService.queryCheckNameUserLogin((UserToken) authenticationToken); LOGGER.info("用户令牌验证:{}", sessionUser); + //todo:shiro 用法可能有问题, SimpleAuthenticationInfo这里的参数应该为 user信息或者username, 密码, realm name,这里没传密码传的是用户名 + //没有用shiro的验证方式,走的是自己的密码验证逻辑 return new SimpleAuthenticationInfo(sessionUser, ((UserToken) authenticationToken).getLoginName(), this.getName()); } catch (Exception e) { e.printStackTrace(); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java index e8efd9f..140e23d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/WhiteController.java @@ -433,11 +433,16 @@ public class WhiteController extends CoreBaseController { userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.SYSTEM_ERROR; LOGGER.warn("Impp业务异常Exception 登录失败 ", e); } finally { + if (result != null && !result.isSuccess() ){ + if(CommonEnumUtil.USER_LOGIN_STATUS.LOGIN_SUCCESS.getValue() == userLoginStatus.getValue()){ + userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.SYSTEM_ERROR; + } + } // 记录登录记录 recordSysUserLog(null, loginModel.getLoginName(), userLoginStatus.getValue()); } - LOGGER.info("会员{}登陆登录完成 ,语言:{} , 登录耗时:{}", loginModel.getLoginName(), BaseThreadLocal.getThreadLanguageCode(), (System.currentTimeMillis() - startTime)); + LOGGER.info("会员{}登陆登录完成,登录{},语言:{} , 登录耗时:{}", loginModel.getLoginName(),result.isSuccess()? "成功":"失败", BaseThreadLocal.getThreadLanguageCode(), (System.currentTimeMillis() - startTime)); return result; } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java index 2e9a27f..8949bae 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/PersonnelController.java @@ -116,14 +116,18 @@ public class PersonnelController extends CoreBaseController { } info.setUserInfoStatus(CommonEnumUtil.USER_INFO_STATUS.INCUMBENT.getValue()); - info.setUserLoginNum(0); + if (info.getUserLoginNum() == null){ + info.setUserLoginNum(0); + } info.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); ConvertBean.modelInitialize(info, AuthUtil.getSessionUser()); user.setUserType(CommonEnumUtil.USER_TYPE.USER.getValue()); user.setUserStatus(CommonEnumUtil.USER_STATUS.ENABLE.getValue()); user.setIsValid(CommonEnumUtil.IS_VAILD.VAILD.getValue()); - user.setUserLoginNum(0); + if (user.getUserLoginNum() == null){ + user.setUserLoginNum(0); + } ConvertBean.modelInitialize(user, AuthUtil.getSessionUser()); SysDepartment infoDepartment = departmentService.get(Long.parseLong(model.getInfoDepartmentId())); @@ -144,6 +148,7 @@ public class PersonnelController extends CoreBaseController { info.setOrganizeCode(infoOrganize.getOrganizeCode()); info.setPositionId(position.getId()); info.setPositionNameRdd(position.getName()); + info.setUserLoginLastDateTime(TimeTool.getNowTime(true)); personnelService.saveSysUserInfo(info); user.setDepartmentId(userDepartment.getId()); @@ -151,6 +156,7 @@ public class PersonnelController extends CoreBaseController { user.setOrganizeId(userOrganize.getId()); user.setOrganizeNameRdd(userOrganize.getName()); user.setOrganizeCode(userOrganize.getOrganizeCode()); + user.setUserLoginLastDateTime(TimeTool.getNowTime(true)); user.setUserInfoId(info.getId()); //松下需要创建的新用户 第一次登陆系统就要重置密码 // user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java index 74961c0..6238667 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysUserController.java @@ -846,4 +846,5 @@ public class SysUserController extends CoreBaseController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java index 639f004..84007c2 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SystemLoginService.java @@ -20,6 +20,7 @@ import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ImppSwitchUtil; +import cn.estsh.impp.framework.boot.util.ResultBean; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.CredentialsException; @@ -248,7 +249,15 @@ public class SystemLoginService implements ISystemLoginService { } if (StringUtils.equals(passwordStr, SysUserPasswordUtil.encoder(pwd))) { - userPasswordUtil.checkSysUserLogin(user); +// ResultBean resultBean = userPasswordUtil.checkSysUserLogin(user); +// if (!resultBean.isSuccess()) { +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(resultBean.getCode()) +// .setErrorDetail(resultBean.getErrorMsg()) +// .setErrorSolution("请联系系统管理员") +// .build(); +// } return user; } LOGGER.error("密码验证错误。"); @@ -270,7 +279,16 @@ public class SystemLoginService implements ISystemLoginService { return user; } - userPasswordUtil.checkSysUserLogin(user); + +// ResultBean resultBean = userPasswordUtil.checkSysUserLogin(user); +// if (!resultBean.isSuccess()) { +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(resultBean.getCode()) +// .setErrorDetail(resultBean.getErrorMsg()) +// .setErrorSolution("请联系系统管理员") +// .build(); +// } return user; } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java index 9c0f7f2..68b4c2c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/DefaultLoginStrategy.java @@ -75,13 +75,24 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { userService.validatePasswordByLoginNameAndReturnUser(loginModel.getLoginName(),loginModel.getLoginPwd()); validatePasswordIsExpired(loginModel.getLoginName()); - SessionUser user = userService.loginUser( + ResultBean tempResult = userService.loginUser( loginModel.getLoginName().trim(), loginModel.getLoginPwd().trim(), loginModel.getLanguageCode(), loginService.getLoginPlatform(request).getValue(), loginModel.getDeviceId() ); + if (!tempResult.isSuccess() || null == tempResult.getResultObject() ){ + return tempResult; + } + SessionUser user = tempResult.getResultObject(); +// SessionUser user = userService.loginUser( +// loginModel.getLoginName().trim(), +// loginModel.getLoginPwd().trim(), +// loginModel.getLanguageCode(), +// loginService.getLoginPlatform(request).getValue(), +// loginModel.getDeviceId() +// ); String redisKey = CommonConstWords.USER_LOGIN_ERROR + "_" + user.getUser().getId(); redisCore.deleteKey(redisKey); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/E9LoginStrategy.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/E9LoginStrategy.java index 3df1d0e..55adfc8 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/E9LoginStrategy.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/E9LoginStrategy.java @@ -74,13 +74,24 @@ public class E9LoginStrategy implements ISystemLoginStrategyService { AuthUtil.logout(); } - SessionUser user = userService.loginUser( - loginModel.getLoginName().trim(), +// SessionUser user = userService.loginUser( +// loginModel.getLoginName().trim(), +// loginModel.getLoginName().trim(), +// loginModel.getLanguageCode(), +// loginService.getLoginPlatform(request).getValue(), +// loginModel.getDeviceId() +// ); + ResultBean tempResult = userService.loginUser( loginModel.getLoginName().trim(), + loginModel.getLoginPwd().trim(), loginModel.getLanguageCode(), loginService.getLoginPlatform(request).getValue(), loginModel.getDeviceId() ); + if (!tempResult.isSuccess() || null == tempResult.getResultObject() ){ + return tempResult; + } + SessionUser user = tempResult.getResultObject(); String redisKey = CommonConstWords.USER_LOGIN_ERROR + "_" + user.getUser().getId(); redisCore.deleteKey(redisKey); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/NameLoginStrategy.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/NameLoginStrategy.java index c78ce6e..77cb826 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/NameLoginStrategy.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/NameLoginStrategy.java @@ -70,13 +70,17 @@ public class NameLoginStrategy implements ISystemLoginStrategyService { AuthUtil.logout(); } - SessionUser user = userService.loginUser( - loginModel.getLoginName().trim(), + ResultBean tempResult = userService.loginUser( loginModel.getLoginName().trim(), + loginModel.getLoginPwd().trim(), loginModel.getLanguageCode(), loginService.getLoginPlatform(request).getValue(), loginModel.getDeviceId() ); + if (!tempResult.isSuccess() || null == tempResult.getResultObject() ){ + return tempResult; + } + SessionUser user = tempResult.getResultObject(); String redisKey = CommonConstWords.USER_LOGIN_ERROR + "_" + user.getUser().getId(); redisCore.deleteKey(redisKey); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java index d0476ba..ee69306 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserSavePasswordService.java @@ -140,12 +140,17 @@ public class SysUserSavePasswordService extends CrudService imp user.setUserLoginPassword(newPwd); userPasswordUtil.checkPasswordSave(user); - userPasswordRDao.updateByProperties( - new String[]{"userId", "isDeleted"}, - new Object[]{user.getId(), CommonEnumUtil.IS_DEAL.NO.getValue()}, - new String[]{"isDeleted", "modifyDatetime", "modifyUser"}, - new Object[]{ - CommonEnumUtil.IS_DEAL.YES.getValue(), TimeTool.getNowTime(true), loginName}); + //如果是首次登录修改密码,则设置登录次数为1 + if(null == user.getUserLoginNum() || user.getUserLoginNum() == 0){ + userService.updateUserLoginNum(user.getId(),1); + } + userPasswordRDao.updateByProperties( + new String[]{"userId", "isDeleted"}, + new Object[]{user.getId(), CommonEnumUtil.IS_DEAL.NO.getValue()}, + new String[]{"isDeleted", "modifyDatetime", "modifyUser",}, + new Object[]{ + CommonEnumUtil.IS_DEAL.YES.getValue(), TimeTool.getNowTime(true), loginName}); + SysUserPassword pwd = new SysUserPassword(); pwd.setUserId(user.getId()); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java index 98cb5fe..5aa06df 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysUserService.java @@ -13,14 +13,12 @@ import cn.estsh.i3plus.pojo.base.bean.ListPager; import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.common.PagerHelper; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; -import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; import cn.estsh.i3plus.pojo.base.shirotoken.AdminToken; import cn.estsh.i3plus.pojo.base.shirotoken.BaseToken; import cn.estsh.i3plus.pojo.base.shirotoken.SaAdminToken; import cn.estsh.i3plus.pojo.base.shirotoken.UserToken; import cn.estsh.i3plus.pojo.base.tool.DdlPreparedPack; import cn.estsh.i3plus.pojo.base.tool.HqlPack; -import cn.estsh.i3plus.pojo.mdm.sqlpack.DdlMdmBusiPreparedPack; import cn.estsh.i3plus.pojo.platform.bean.*; import cn.estsh.i3plus.pojo.platform.repository.SysLogUserLoginRepository; import cn.estsh.i3plus.pojo.platform.repository.SysRefUserDepartmentRepository; @@ -30,6 +28,7 @@ import cn.estsh.i3plus.pojo.platform.repository.SysUserInfoRepository; import cn.estsh.i3plus.pojo.platform.repository.SysUserRepository; import cn.estsh.i3plus.pojo.platform.sqlpack.CoreHqlPack; import cn.estsh.impp.framework.boot.auth.AuthUtil; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.RedisCacheTool; @@ -129,25 +128,56 @@ public class SysUserService implements ISysUserService { @Override @ApiOperation(value = "用户登录", notes = "用户登录功能实现") @Transactional(propagation = Propagation.REQUIRED) - public SessionUser loginUser(String loginName, String password, String languageCode, Integer loginPlatform, String deviceId) throws AuthenticationException { + public ResultBean loginUser(String loginName, String password, String languageCode, Integer loginPlatform, String deviceId) throws AuthenticationException { LOGGER.debug("平台用户 SYS_USER loginName:{} \t password:{} \t languageCode:{}", loginName, password, languageCode); - BaseToken token = getToken(loginName, password, languageCode, loginPlatform); - SessionUser sessionUser = AuthUtil.login(token); - SysUser user = this.getSysUserByLoginName(loginName); - if (user == null) { - throw new CredentialsException("用户不存在"); - } - // 判断会话模式 - checkSessionMode(loginPlatform, user.getId()); + SessionUser sessionUser = null; + SysUser user = null; + ResultBean resultBean = ResultBean.fail(); + try { + BaseToken token = getToken(loginName, password, languageCode, loginPlatform); + user = this.getSysUserByLoginName(loginName); + if (user == null) { + throw new CredentialsException("用户不存在"); + } + //校验 用户 + ResultBean result = passwordUtil.checkSysUserLogin(user); + if (!result.isSuccess()) { + resultBean = result; + return resultBean; + } + sessionUser = AuthUtil.login(token); - packSessionUser(sessionUser, user, user.getUserType(), loginPlatform, languageCode, deviceId); - packConfigSessionUser(sessionUser, user); - AuthUtil.setSessionUser(sessionUser); - refreshUserLoginInformation(user.getId()); - AuthUtil.online(sessionUser); + // 判断会话模式 + checkSessionMode(loginPlatform, user.getId()); - return sessionUser; + packSessionUser(sessionUser, user, user.getUserType(), loginPlatform, languageCode, deviceId); + packConfigSessionUser(sessionUser, user); + AuthUtil.setSessionUser(sessionUser); + AuthUtil.online(sessionUser); + resultBean = ResultBean.success().setResultObject(sessionUser); + } catch (CredentialsException e) { + e.printStackTrace(); + resultBean = ResultBean.fail(e); + } catch (ImppBusiException e) { + e.printStackTrace(); + resultBean = ResultBean.fail(e); + } catch (Exception e) { + e.printStackTrace(); + resultBean = ResultBean.fail(e); + } finally { + //如果登录成功,刷新登录成功次数和上次登录时间 + if (resultBean.isSuccess()){ + this.refreshUserLoginInformation(user.getId()); + }else{ + //如果登录不成功,且有这个用户,就只刷新上次用户的登录时间。 + if (!ObjectUtils.isEmpty(user) && !ObjectUtils.isEmpty(user.getId())) { + this.refreshUserLoginDateTime(user.getId(), user.getUserInfoId()); + } + } + + } + return resultBean; } private void checkSessionMode(Integer loginPlatform, Long userId) { @@ -303,6 +333,29 @@ public class SysUserService implements ISysUserService { } @Override + public void updateUserLoginNum(Long userId,Integer loginNum) { + SysUser user = userRDao.getById(userId); + user.setUserLoginNum(loginNum); + userRDao.save(user); + DdlPackBean userInfoDdlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(user.getUserInfoId(), "id", userInfoDdlPackBean); + sysUserInfoRDao.updateByProperties(new String[]{"userLoginNum"}, new Object[]{loginNum},userInfoDdlPackBean); + } + + + @Override + public void refreshUserLoginDateTime(Long userId, Long userInfoId) { + DdlPackBean userDdlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(userId, "id", userDdlPackBean); + userRDao.updateByProperties(new String[]{"userLoginLastDateTime"}, new Object[]{TimeTool.getNowTime(true)}, userDdlPackBean); + + DdlPackBean userInfoDdlPackBean = DdlPackBean.getDdlPackBean(); + DdlPreparedPack.getNumEqualPack(userInfoId, "id", userInfoDdlPackBean); + sysUserInfoRDao.updateByProperties(new String[]{"userLoginLastDateTime"}, new Object[]{TimeTool.getNowTime(true)}, userInfoDdlPackBean); + } + + + @Override @ApiOperation(value = "新增账号", notes = "新增账号信息") public SysUser insertSysUser(SysUser sysUser) throws Exception { LOGGER.debug("平台用户 SYS_USER SysUser:{}", sysUser); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java index e0421f8..95cbd1d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/MailUtil.java @@ -279,6 +279,14 @@ public class MailUtil { } if (smtpStarttlsEnabled) { server.put("mail.smtp.starttls.enable", "true"); + +// server.put("mail.smtp.ssl.protocols","TLSv1.2"); +// server.put("mail.debug","true"); //开启mail debug日志 +// server.put("mail.smtp.ssl.protocols","TLSv1.2"); +// server.put("mail.debug","true"); +// server.put("mail.smtp.auth.mechanisms","NTLM"); +// server.put("mail.smtp.auth.mechanisms","PLAIN"); +// server.put("mail.smtp.auth.mechanisms","DIGEST-MD5"); } Session conn = Session.getInstance(server, null); diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java index ead89c2..f45498a 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/util/SysUserPasswordUtil.java @@ -54,10 +54,11 @@ public class SysUserPasswordUtil { /** * 密码加密 返回加密信息 + * * @param password * @return */ - public static final String encoder(String password){ + public static final String encoder(String password) { try { return EncryptTool.hexMD5(password); } catch (NoSuchAlgorithmException e) { @@ -215,8 +216,8 @@ public class SysUserPasswordUtil { for (char ch : chars) { // Chart ASCLL 编码比对 特殊字符 - if ((ch >= 32 && ch <= 47)|| (ch >= 58 && ch <= 64)|| - (ch >= 91 && ch <= 96)|| (ch >= 123 && ch <= 126)) { + if ((ch >= 32 && ch <= 47) || (ch >= 58 && ch <= 64) || + (ch >= 91 && ch <= 96) || (ch >= 123 && ch <= 126)) { ++num; } } @@ -270,9 +271,12 @@ public class SysUserPasswordUtil { int lastDay = Integer.MAX_VALUE; if (CollectionUtils.isNotEmpty(passwords)) { for (SysUserPassword password : passwords) { - int day = TimeTool.getSecoundsBetweenTime(4, password.getCreateDatetime(), TimeTool.getNowTime(true)); - if (day < lastDay) { - lastDay = day; + //防止日期转换错误 + if (StringUtils.isNotBlank(password.getCreateDatetime())){ + int day = TimeTool.getSecoundsBetweenTime(4, password.getCreateDatetime(), TimeTool.getNowTime(true)); + if (day < lastDay) { + lastDay = day; + } } } } @@ -307,47 +311,66 @@ public class SysUserPasswordUtil { try { for (String compile : split) { - if(StringUtils.isNotBlank(compile)){ + if (StringUtils.isNotBlank(compile)) { if (!Pattern.compile(compile).matcher(content).find()) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) - .setErrorDetail("正则【"+compile+"】密码校验不通过") + .setErrorDetail("正则【" + compile + "】密码校验不通过") .setErrorSolution("请重新输入") .build(); } } } - }catch (ImppBusiException e){ + } catch (ImppBusiException e) { // 业务异常 抛出 throw e; - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); } } } - /******************************************** 用户登录密码检查 ********************************************/ - public void checkSysUserLogin(SysUser user) { - if(ImppSwitchUtil.isLoginActiveDirectory()){ + public ResultBean checkSysUserLogin(SysUser user) { + if (ImppSwitchUtil.isLoginActiveDirectory()) { // 使用AD域账号登录 - checkActiveDirectory(user); - }else{ + try { + checkActiveDirectory(user); + } catch (ImppBusiException e) { + e.printStackTrace(); + return ResultBean.fail(e); + }catch (Exception e){ + return ResultBean.fail(e); + } + } else { /* 检查密码有效期 */ - checkLoginPasswordTimeOut(user); + ResultBean result = checkLoginPasswordTimeOut(user); + if(!result.isSuccess()){ + return result; + } /* 登录 长时间未登录锁定 */ - checkLoginTimeOut(user); + result = checkLoginTimeOut(user); + if(!result.isSuccess()){ + return result; + } + /* 判断是否第一次登录 */ + result = checkFirstLoginChangePwd(user); + if(!result.isSuccess()){ + return result; + } } + return ResultBean.success(); } /** * 账号 ActiveDirectory 登录集成 + * * @param user */ public void checkActiveDirectory(SysUser user) { - if(ImppSwitchUtil.isLoginActiveDirectory()){ + if (ImppSwitchUtil.isLoginActiveDirectory()) { String activeDirectoryUrl = RedisCacheTool.getSysConfigStrVal(CommonConstWords.CONFIG_PWD_ACTIVE_DIRECTORY_URL); if (StringUtils.isNotBlank(activeDirectoryUrl)) { @@ -374,7 +397,7 @@ public class SysUserPasswordUtil { .setErrorSolution("请重新操作") .build(); } - }else{ + } else { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) @@ -390,13 +413,14 @@ public class SysUserPasswordUtil { */ public void checkLoginErrorNumber(String loginName, ResultBean resultBean, Exception e) { SysUser user = userService.getSysUserByLoginName(loginName); - if(Objects.nonNull(user)){ + if (Objects.nonNull(user)) { checkLoginErrorNumber(user.getId(), resultBean, e); } } /** * 登录 失败次数检查 + * * @param userId * @param resultBean * @param e @@ -409,14 +433,14 @@ public class SysUserPasswordUtil { String redisKey = CommonConstWords.USER_LOGIN_ERROR + ":" + today + ":" + userId; try { Object redisValue = redisCore.getObject(redisKey); - if(Objects.nonNull(redisValue)){ - loginErrorNumber = (Integer)redisValue; + if (Objects.nonNull(redisValue)) { + loginErrorNumber = (Integer) redisValue; } - }catch (Exception exception){ + } catch (Exception exception) { LOGGER.error("获取登录异常次数错误,错误信息:{}", exception.getMessage()); } - if(Objects.equals(loginErrorNumberMax,loginErrorNumber)){ + if (Objects.equals(loginErrorNumberMax, loginErrorNumber)) { // 锁定账号信息 userService.doLockSysUserById(userId); @@ -426,7 +450,7 @@ public class SysUserPasswordUtil { .setErrorDetail("账号已被锁定") .setErrorSolution("请联系系统管理员") .build(); - }else if(loginErrorNumber > loginErrorNumberMax){ + } else if (loginErrorNumber > loginErrorNumberMax) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) @@ -436,82 +460,133 @@ public class SysUserPasswordUtil { } // 登录异常 更新登录失败次数 - if(Objects.nonNull(e)){ + if (Objects.nonNull(e)) { ++loginErrorNumber; - if(Objects.nonNull(resultBean)){ + if (Objects.nonNull(resultBean)) { int num = loginErrorNumberMax - loginErrorNumber; - if(num == 0){ + if (num == 0) { resultBean.setErrorMsg(LocaleUtils.getLocaleRes("密码输入错误。用户已被锁定请联系管理员!")); - }else{ + } else { resultBean.setErrorMsg(String.format(LocaleUtils.getLocaleRes("密码输入错误。再输入错误 %s 次,用户将被锁定"), num)); } } - redisCore.putObject(redisKey,loginErrorNumber,CommonConstWords.REDIS_TIME_DAY_ONE); + redisCore.putObject(redisKey, loginErrorNumber, CommonConstWords.REDIS_TIME_DAY_ONE); } } /** * 登录 检查密码有效期 */ - private void checkLoginPasswordTimeOut(SysUser user) { + private ResultBean checkLoginPasswordTimeOut(SysUser user) { try { int passwordDayMax = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_PWD_VALID_DAY, CommonConstWords.CONFIG_PWD_VALID_DAY_DEFAULT); - if(passwordDayMax > 0){ + if (passwordDayMax > 0) { SysUserPassword password = userPasswordService.get(user.getUserLoginPasswordId()); - if(Objects.nonNull(password)){ + if (Objects.nonNull(password) && StringUtils.isNotBlank(password.getCreateDatetime())) { int day = TimeTool.getSecoundsBetweenTime(4, password.getCreateDatetime(), TimeTool.getNowTime(true)); - if(day > passwordDayMax){ + if (day > passwordDayMax) { // 锁定账号信息 userService.doLockSysUserById(user.getId()); - throw ImppExceptionBuilder.newInstance() +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) +// .setErrorDetail("账号密码已过期") +// .setErrorSolution("请联系系统管理员") +// .build(); + ImppBusiException exception = ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) .setErrorDetail("账号密码已过期") .setErrorSolution("请联系系统管理员") .build(); + return ResultBean.fail(exception); } } } - }catch (ImppBusiException e){ - throw e; - }catch (Exception e){ + } catch (ImppBusiException e) { +// throw e; + e.printStackTrace(); + return ResultBean.fail(e); + } catch (Exception e) { LOGGER.error("密码有效期处理异常,异常信息:{}", e.getMessage()); e.printStackTrace(); + return ResultBean.fail(e); } + return ResultBean.success(); } /** * 登录 长时间未登录锁定 */ - private void checkLoginTimeOut(SysUser user) { + private ResultBean checkLoginTimeOut(SysUser user) { try { + if (StringUtils.isBlank(user.getUserLoginLastDateTime())){ + return ResultBean.success("上次登录时间为空"); + } int loginDayMax = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_USER_LOGIN_DAY_OUT, CommonConstWords.CONFIG_USER_LOGIN_DAY_OUT_DEFAULT); - if(loginDayMax > 0){ + if (loginDayMax > 0) { int day = TimeTool.getSecoundsBetweenTime(4, user.getUserLoginLastDateTime(), TimeTool.getNowTime(true)); - if(day > loginDayMax){ + if (day > loginDayMax) { // 锁定账号信息 //todo: 账户没有被锁定,由于异常事务回滚,导致账户没有被锁定,这个更新操作就是多余的 userService.doLockSysUserById(user.getId()); - throw ImppExceptionBuilder.newInstance() +// throw ImppExceptionBuilder.newInstance() +// .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) +// .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) +// .setErrorDetail("长时间未登录账号已被锁定") +// .setErrorSolution("请联系系统管理员") +// .build(); + ImppBusiException exception = ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) .setErrorDetail("长时间未登录账号已被锁定") .setErrorSolution("请联系系统管理员") .build(); + return ResultBean.fail(exception); + } } - }catch (ImppBusiException e){ - throw e; - }catch (Exception e){ - LOGGER.error("密码有效期处理异常,异常信息:{}", e.getMessage()); + } catch (ImppBusiException e) { +// throw e; + e.printStackTrace(); + return ResultBean.fail(e); + } catch (Exception e) { + LOGGER.error("长时间未登录处理异常,异常信息:{}", e.getMessage()); + e.printStackTrace(); + return ResultBean.fail(e); + } + return ResultBean.success(); + } + + + /** + * 第一次登录是否修改密码 + */ + private ResultBean checkFirstLoginChangePwd(SysUser user) { + + try { + int firstLoginChangePwd = RedisCacheTool.getSysConfigIntVal(CommonConstWords.FIRST_LOGIN_CHANGE_PWD_SWITCH_KEY, CommonConstWords.FIRST_LOGIN_CHANGE_PWD_SWITCH_DEFAULT_VALUE); + if (CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == firstLoginChangePwd) { + if (null == user.getUserLoginNum() || user.getUserLoginNum() <= 0) { + return ResultBean.fail() + .setCode(ImppExceptionEnum.LOGIN_EXCEPTION_CHANGE_PWD.getCode()) + .setErrorMsg(ImppExceptionEnum.LOGIN_EXCEPTION_CHANGE_PWD.getDescription()); + } + } + } catch (ImppBusiException e) { + return ResultBean.fail(e); + } catch (Exception e) { + LOGGER.error("首次登录验证出错,异常信息:{}", e.getMessage()); e.printStackTrace(); + return ResultBean.fail(e); } + return ResultBean.success(); } } diff --git a/modules/i3plus-core-apiservice/src/main/resources/application.properties b/modules/i3plus-core-apiservice/src/main/resources/application.properties index 80d6f6a..ccb1d71 100644 --- a/modules/i3plus-core-apiservice/src/main/resources/application.properties +++ b/modules/i3plus-core-apiservice/src/main/resources/application.properties @@ -1,5 +1,5 @@ #\u4F7F\u7528\u914D\u7F6E -spring.profiles.active=docker +spring.profiles.active=test #\u9879\u76EE\u63CF\u8FF0\u4FE1\u606F\uFF08swagger\u4E2D\u663E\u5F0F\uFF09\uFF0C\u4E2D\u6587\u4F7F\u7528uncode\u8F6C\u7801 desc.application.name=\u6838\u5FC3\u7BA1\u7406\u540E\u53F0