diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemLoginService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemLoginService.java index eb5dcb5..5b3240c 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemLoginService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/base/ISystemLoginService.java @@ -92,6 +92,31 @@ public interface ISystemLoginService { SessionUser queryCheckE9SaAdminLogin(SaAdminToken saAdminToken); /** + * Name用户单点登录 + * + * @param userToken 用户token + * @return 用户会话 + */ + @ApiOperation(value = "封装用户", notes = "封装普通用户信息") + SessionUser queryCheckNameUserLogin(UserToken userToken); + /** + * NameAdmin单点登录 + * + * @param adminToken admin token + * @return 用户会话 + */ + @ApiOperation(value = "封装用户", notes = "封装管理员信息") + SessionUser queryCheckNameAdminLogin(AdminToken adminToken); + + /** + * Name SA单点登录 + * @param saAdminToken sa token + * @return 用户会话 + */ + @ApiOperation(value = "封装用户", notes = "封装超级管理员信息") + SessionUser queryCheckNameSaAdminLogin(SaAdminToken saAdminToken); + + /** * 记录登录错误 * * @param loginName 账号 diff --git a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java index 1bce21d..2c77db1 100644 --- a/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java +++ b/modules/i3plus-core-api/src/main/java/cn/estsh/i3plus/core/api/iservice/busi/ISysUserPasswordService.java @@ -4,8 +4,6 @@ import cn.estsh.i3plus.pojo.platform.bean.SysUserPassword; import cn.estsh.impp.framework.base.service.ICrudService; import io.swagger.annotations.ApiOperation; -import java.util.List; - /** * @Description : * @Reference : @@ -24,7 +22,11 @@ public interface ISysUserPasswordService extends ICrudService { @ApiOperation(value = "修改用户密码") void updatePassword(Long userId,String password,String newPwd); + @ApiOperation(value = "修改用户密码") + void updatePassword(String loginName,String password,String newPwd); + @ApiOperation(value = "重置用户密码") void updatePassword(Long userId,String password); + void updatePasswordWizoutSession(String loginName,String password,String newPwd); } 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 df2219e..e6d1196 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 @@ -3,7 +3,11 @@ package cn.estsh.i3plus.core.api.iservice.busi; 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.i3plus.pojo.platform.bean.SessionUser; +import cn.estsh.i3plus.pojo.platform.bean.SysLogUserLogin; +import cn.estsh.i3plus.pojo.platform.bean.SysRefUserRole; +import cn.estsh.i3plus.pojo.platform.bean.SysUser; +import cn.estsh.i3plus.pojo.platform.bean.SysUserInfo; import io.swagger.annotations.ApiOperation; import org.apache.shiro.authc.AuthenticationException; @@ -300,4 +304,14 @@ public interface ISysUserService { */ @ApiOperation(value = "根据id查询用户信息") List findSysUserByIds(Long[] ids); + + + /** + * 根据用户名查询密码是否正确 + * + * @param loginName 用户名 + * @param password 密码 + */ + @ApiOperation(value = "根据用户名查询密码是否正确") + SysUser validatePasswordByLoginNameAndReturnUser(String loginName, String password); } diff --git a/modules/i3plus-core-apiservice/pom.xml b/modules/i3plus-core-apiservice/pom.xml index 67b6898..bce7a7a 100644 --- a/modules/i3plus-core-apiservice/pom.xml +++ b/modules/i3plus-core-apiservice/pom.xml @@ -89,6 +89,11 @@ i3plus.sdk + i3plus-sdk-dingtalk + + + + i3plus.sdk i3plus-sdk-sms @@ -174,6 +179,7 @@ i3plus.pojo i3plus-pojo-mes + org.slf4j slf4j-api @@ -337,4 +343,13 @@ + + + public + + http://mvn.estsh.com/repository/maven-public/ + + + + \ No newline at end of file diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/ShiroAuthConfiguration.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/ShiroAuthConfiguration.java index c87079e..e6cafcb 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/ShiroAuthConfiguration.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/ShiroAuthConfiguration.java @@ -7,6 +7,9 @@ import cn.estsh.i3plus.core.apiservice.auth.realm.UserAuthRealm; import cn.estsh.i3plus.core.apiservice.auth.realm.strategy.e9.E9AdminAuthRealm; import cn.estsh.i3plus.core.apiservice.auth.realm.strategy.e9.E9SaAuthRealm; import cn.estsh.i3plus.core.apiservice.auth.realm.strategy.e9.E9UserAuthRealm; +import cn.estsh.i3plus.core.apiservice.auth.realm.strategy.name.NameAdminAuthRealm; +import cn.estsh.i3plus.core.apiservice.auth.realm.strategy.name.NameSaAuthRealm; +import cn.estsh.i3plus.core.apiservice.auth.realm.strategy.name.NameUserAuthRealm; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; @@ -107,6 +110,21 @@ public class ShiroAuthConfiguration { return new E9UserAuthRealm(); } + @Bean + public NameAdminAuthRealm nameAdminAuthRealm() { + return new NameAdminAuthRealm(); + } + + @Bean + public NameSaAuthRealm nameSaAuthRealm() { + return new NameSaAuthRealm(); + } + + @Bean + public NameUserAuthRealm nameUserAuthRealm() { + return new NameUserAuthRealm(); + } + public Map supportRealmMap() { //支持的授权规则 Map realms = new HashMap(8); @@ -123,6 +141,12 @@ public class ShiroAuthConfiguration { .saRealm(e9SaAuthRealm()).build(); realms.put(ImppEnumUtil.AUTH_LOGIN_STRATEGY.E9.getCode(), e9RoleRealmModel); + RoleRealmModel nameRoleRealmModel = RoleRealmModel.builder() + .userRealm(nameUserAuthRealm()) + .adminRealm(nameAdminAuthRealm()) + .saRealm(nameSaAuthRealm()).build(); + realms.put(ImppEnumUtil.AUTH_LOGIN_STRATEGY.NAME.getCode(), nameRoleRealmModel); + return realms; } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameAdminAuthRealm.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameAdminAuthRealm.java new file mode 100644 index 0000000..2276c16 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameAdminAuthRealm.java @@ -0,0 +1,55 @@ +package cn.estsh.i3plus.core.apiservice.auth.realm.strategy.name; + +import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; +import cn.estsh.i3plus.pojo.base.shirotoken.AdminToken; +import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description : 验证规则 + * @Reference : + * @Author : alwaysfrin + * @CreateDate : 2018-10-13 14:04 + * @Modify: + **/ +public class NameAdminAuthRealm extends AuthorizingRealm { + public static final Logger LOGGER = LoggerFactory.getLogger(NameAdminAuthRealm.class); + + @Autowired + private ISystemLoginService systemLoginService; + + public NameAdminAuthRealm() { + //添加支持的token + this.setAuthenticationTokenClass(AdminToken.class); + } + + //权限验证 + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + return new SimpleAuthorizationInfo(); + } + + //令牌确认 + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + try { + //管理员令牌 + SessionUser sessionUser = systemLoginService.queryCheckNameAdminLogin((AdminToken) authenticationToken); + LOGGER.info("管理员令牌验证:{}", sessionUser); + return new SimpleAuthenticationInfo(sessionUser, ((AdminToken) authenticationToken).getLoginName(), this.getName()); + } catch (Exception e) { + e.printStackTrace(); + throw new AuthenticationException(e.getMessage()); + } + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameSaAuthRealm.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameSaAuthRealm.java new file mode 100644 index 0000000..ad64399 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameSaAuthRealm.java @@ -0,0 +1,50 @@ +package cn.estsh.i3plus.core.apiservice.auth.realm.strategy.name; + +import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; +import cn.estsh.i3plus.pojo.base.shirotoken.SaAdminToken; +import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description : 验证规则 + * @Reference : + * @Author : alwaysfrin + * @CreateDate : 2018-10-13 14:04 + * @Modify: + **/ +public class NameSaAuthRealm extends AuthorizingRealm { + public static final Logger LOGGER = LoggerFactory.getLogger(NameSaAuthRealm.class); + + @Autowired + private ISystemLoginService systemLoginService; + + public NameSaAuthRealm() { + //添加支持的token + this.setAuthenticationTokenClass(SaAdminToken.class); + } + + //权限验证 + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + return new SimpleAuthorizationInfo(); + } + + //令牌确认 + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + //管理员令牌 + SessionUser sessionUser = systemLoginService.queryCheckNameSaAdminLogin((SaAdminToken) authenticationToken); + LOGGER.info("超级管理员令牌验证:{}", sessionUser); + return new SimpleAuthenticationInfo(sessionUser, ((SaAdminToken) authenticationToken).getLoginName(), this.getName()); + } +} 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 new file mode 100644 index 0000000..7d8b905 --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/auth/realm/strategy/name/NameUserAuthRealm.java @@ -0,0 +1,55 @@ +package cn.estsh.i3plus.core.apiservice.auth.realm.strategy.name; + +import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; +import cn.estsh.i3plus.pojo.base.shirotoken.UserToken; +import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @Description : 验证规则 + * @Reference :- + * @Author : alwaysfrin + * @CreateDate : 2018-10-13 14:04 + * @Modify: + **/ +public class NameUserAuthRealm extends AuthorizingRealm { + public static final Logger LOGGER = LoggerFactory.getLogger(NameUserAuthRealm.class); + + @Autowired + private ISystemLoginService systemLoginService; + + public NameUserAuthRealm() { + //添加支持的token + this.setAuthenticationTokenClass(UserToken.class); + } + + //权限验证 + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + return new SimpleAuthorizationInfo(); + } + + //令牌确认 + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + try { + //管理员令牌 + SessionUser sessionUser = systemLoginService.queryCheckNameUserLogin((UserToken) authenticationToken); + LOGGER.info("用户令牌验证:{}", sessionUser); + return new SimpleAuthenticationInfo(sessionUser, ((UserToken) authenticationToken).getLoginName(), this.getName()); + } catch (Exception e) { + e.printStackTrace(); + throw new AuthenticationException(e.getMessage()); + } + } +} diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/SystemController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/SystemController.java index 6de22d1..159748c 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/SystemController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/base/SystemController.java @@ -1,12 +1,10 @@ package cn.estsh.i3plus.core.apiservice.controller.base; -import cn.estsh.i3plus.core.api.iservice.busi.ISysDictionaryService; -import cn.estsh.i3plus.icloud.wms.sdk.IWmsCommonCloud; +import cn.estsh.i3plus.core.api.iservice.busi.ISysUserPasswordService; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; -import cn.estsh.impp.framework.boot.configuration.SystemConfig; import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ImppRedis; @@ -28,7 +26,11 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; /** * @Description : @@ -47,17 +49,11 @@ public class SystemController { @Autowired private Environment environment; - @Autowired - private IWmsCommonCloud wmsCommonCloud; - @Resource(name = CommonConstWords.IMPP_REDIS_CORE) protected ImppRedis redisCore; @Autowired - private ISysDictionaryService sysDictionaryService; - - @Autowired - private SystemConfig systemConfig; + private ISysUserPasswordService userPasswordService; @GetMapping("/get-properties") @ApiOperation(value = "获取系统配置信息", notes = "获取系统配置信息") @@ -139,4 +135,5 @@ public class SystemController { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } + } 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 e849270..32f7e8b 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 @@ -2,7 +2,6 @@ package cn.estsh.i3plus.core.apiservice.controller.base; import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService; import cn.estsh.i3plus.core.api.iservice.base.ISystemInitService; -import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService; import cn.estsh.i3plus.core.api.iservice.busi.*; import cn.estsh.i3plus.core.apiservice.controller.busi.PersonnelController; @@ -29,6 +28,7 @@ import cn.estsh.i3plus.pojo.model.platform.SysLoginModel; import cn.estsh.i3plus.pojo.model.platform.UserDetailModel; import cn.estsh.i3plus.pojo.model.platform.UserDetailPagerModel; import cn.estsh.i3plus.pojo.platform.bean.*; +import cn.estsh.i3plus.sdk.dingtalk.cn.estsh.i3plus.sdk.service.IDingTalkService; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; @@ -42,11 +42,15 @@ import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.SpringContextsUtil; import cn.estsh.impp.framework.boot.util.ValidatorBean; import com.alibaba.fastjson.JSONObject; +import com.dingtalk.api.response.OapiV2UserGetResponse; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.CredentialsException; +import org.apache.shiro.authc.ExpiredCredentialsException; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.UnknownAccountException; @@ -75,6 +79,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.concurrent.TimeUnit; import java.util.function.BiFunction; import java.util.stream.Collectors; @@ -132,7 +137,7 @@ public class WhiteController extends CoreBaseController { private ISysConfigService configService; @Autowired - private ISystemLoginService loginService; + private ISysUserPasswordService userPasswordService; @Autowired private SysUserPasswordUtil userPasswordUtil; @@ -149,6 +154,14 @@ public class WhiteController extends CoreBaseController { @Autowired private RabbitTemplate rabbitTemplate; + @Autowired + private IDingTalkService dingTalkService; + + private Cache unsavedLocaleResSwitch = CacheBuilder.newBuilder() + .maximumSize(1) + .expireAfterWrite(1, TimeUnit.MINUTES) + .build(); + @GetMapping(value = "/sys-locale-language/list") @ApiOperation(value = "查询可用语言", notes = "查询可用语言") public ResultBean listSysLocaleLanguage() { @@ -285,6 +298,54 @@ public class WhiteController extends CoreBaseController { return Optional.ofNullable(data); } + @GetMapping(value = "/auth/dingtalk/login") + @ApiOperation(value = "登录", notes = "登录") + public ResultBean loginByPhoneNumber(HttpServletRequest request, String dingTalkTmpAuthCode, + @RequestParam(required = false) String languageCode, + @RequestParam(required = false) String deviceId) { + SysLoginModel loginModel = SysLoginModel.builder() + .dingTalkTmpAuthCode(dingTalkTmpAuthCode) + .languageCode(languageCode) + .deviceId(deviceId) + .loginStrategy(ImppEnumUtil.AUTH_LOGIN_STRATEGY.NAME.getCode()).build(); + + String dingTalkUrl = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_URL); + String dingTalkAppKey = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_APP_KEY); + String dingTalkAppSecret = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_APP_SECRET); + String dingTalkWhiteList = RedisCacheTool.getSysConfigStrVal(PlatformConstWords.DINGTALK_WHITE_LIST); + + if (StringUtils.isEmpty(dingTalkUrl) || + StringUtils.isEmpty(dingTalkAppKey) || + StringUtils.isEmpty(dingTalkAppSecret) || + StringUtils.isEmpty(dingTalkWhiteList)) { + return ResultBean.fail("访问钉钉的系统参数缺失,请在平台的系统参数中进行配置"); + } + + Optional userInfo = + dingTalkService.getUserInfo(dingTalkUrl, dingTalkAppKey, dingTalkAppSecret, loginModel.getDingTalkTmpAuthCode()); + if (userInfo.isPresent()) { + String mobile = userInfo.get().getResult().getMobile(); + if (StringUtils.isEmpty(mobile)) { + return ResultBean.fail("用户并未在钉钉中设置手机号 或 钉钉接口权限不足无法获取到手机号"); + } + if (!Arrays.asList(dingTalkWhiteList.split(",")).contains(mobile)) { + return ResultBean.fail("对指定手机号允许,权限不足,请联系管理员"); + } + SysUser sysUserByPhone = userService.getSysUserByPhone(mobile); + if (sysUserByPhone == null) { + return ResultBean.fail("未根据用户手机在平台中找到相应记录 钉钉获取的手机号为" + mobile); + } + loginModel.setLoginName(sysUserByPhone.getUserLoginName()); + loginModel.setPhoneNumber(mobile); + } else { + return ResultBean.fail("获取钉钉用户信息失败"); + } + String beanName = ImppEnumUtil.AUTH_LOGIN_STRATEGY.codeOfStrategyName(loginModel.getLoginStrategy()); + ISystemLoginStrategyService loginStrategyService = (ISystemLoginStrategyService) SpringContextsUtil.getBean(beanName); + + return loginByStrategy(request, loginModel, loginStrategyService.login()); + } + @GetMapping(value = "/auth/login") @ApiOperation(value = "登录", notes = "登录") public ResultBean login(HttpServletRequest request, String loginName, String loginPwd, @@ -316,8 +377,10 @@ public class WhiteController extends CoreBaseController { } catch (IncorrectCredentialsException e) { result = ResultBean.fail(ImppExceptionEnum.LOGIN_EXCEPTION_USER_PASSWORD); userPasswordUtil.checkLoginErrorNumber(loginModel.getLoginName(), result, e); - userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.WRONG_PASSWORD; + } catch (ExpiredCredentialsException e) { + result = ResultBean.fail(ImppExceptionEnum.LOGIN_EXCEPTION_PASSWORD_EXPIRED); + userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.WRONG_USERNAME_OR_PASSWORD; } catch (CredentialsException e) { // 用户名或密码错误 result = ResultBean.fail(ImppExceptionEnum.LOGIN_EXCEPTION_USER_NAME); @@ -335,13 +398,16 @@ public class WhiteController extends CoreBaseController { result = ResultBean.fail(ImppExceptionEnum.LOGIN_EXCEPTION_USER_PASSWORD.getDescription()).setCode(ImppExceptionEnum.LOGIN_EXCEPTION_USER_PASSWORD.getCode()); result.setErrorMsg(e.getMessage()); userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.SYSTEM_ERROR; + LOGGER.warn("Impp业务异常AuthenticationException 登录失败 ", e); } catch (ImppBusiException e) { result = ResultBean.fail(e); userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.SYSTEM_ERROR; + LOGGER.warn("Impp业务异常ImppBusiException 登录失败 ", e); } catch (Exception e) { result = ResultBean.fail(e.getMessage()).setCode(ImppExceptionEnum.SYSTEM_EXCEPTION.getCode()) .setErrorMsg(LocaleUtils.getEnumLocaleResDesc(ImppExceptionEnum.SYSTEM_EXCEPTION, ImppExceptionEnum.SYSTEM_EXCEPTION.getDescription())); userLoginStatus = CommonEnumUtil.USER_LOGIN_STATUS.SYSTEM_ERROR; + LOGGER.warn("Impp业务异常Exception 登录失败 ", e); } finally { // 记录登录记录 recordSysUserLog(null, loginModel.getLoginName(), userLoginStatus.getValue()); @@ -685,6 +751,17 @@ public class WhiteController extends CoreBaseController { @ApiOperation(value = "缺失资源", notes = "缺失资源") public ResultBean getMissResourceByKey(String key, String menuCode) { try { + Integer switcher = unsavedLocaleResSwitch.asMap().get(PlatformConstWords.WEB_MISS_RESOURCE_LISTENER_SWITCH); + + if (switcher == null) { + switcher = RedisCacheTool.getSysConfigIntVal(PlatformConstWords.WEB_MISS_RESOURCE_LISTENER_SWITCH, + CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()); + unsavedLocaleResSwitch.put(PlatformConstWords.WEB_MISS_RESOURCE_LISTENER_SWITCH, switcher); + } + if (switcher == -1 || switcher == CommonEnumUtil.TRUE_OR_FALSE.FALSE.getValue()) { + return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } + Map missResource = new HashMap<>(); missResource.put(key, menuCode); rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_RESOURCE, JsonUtilTool.encode(missResource)); @@ -717,6 +794,24 @@ public class WhiteController extends CoreBaseController { } } + @PutMapping(value = "/update-expired-password") + @ApiOperation(value = "修改密码", notes = "松下修改当前登录用户密码") + public ResultBean updateSysUserPassword(String loginName, String password, String newPwd) { + try { + // 数据校验 + ValidatorBean.checkNotNull(password, "旧密码不能为空"); + ValidatorBean.checkNotNull(newPwd, "新密码不能为空"); + ValidatorBean.checkNotNull(loginName, "用户名不能为空"); + + userPasswordService.updatePasswordWizoutSession(loginName, password, newPwd.trim()); + return ResultBean.success("修改密码成功,请重新登陆").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()); + } catch (ImppBusiException busExcep) { + return ResultBean.fail(busExcep); + } catch (Exception e) { + return ImppExceptionBuilder.newInstance().buildExceptionResult(e); + } + } + @PostMapping(value = "/license") @ApiOperation(value = "更新授权", notes = "更新授权") public ResultBean updateLicense(String content) { 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 9a2fbbb..523cb7c 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 @@ -22,6 +22,7 @@ import cn.estsh.i3plus.pojo.model.platform.UserDetailModel; import cn.estsh.i3plus.pojo.model.platform.UserDetailPagerModel; import cn.estsh.i3plus.pojo.model.platform.UserRolePagerModel; import cn.estsh.i3plus.pojo.platform.bean.*; +import cn.estsh.i3plus.pojo.platform.repository.SysUserPasswordRepository; import cn.estsh.impp.framework.base.controller.CoreBaseController; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppBusiException; @@ -87,8 +88,12 @@ public class PersonnelController extends CoreBaseController { @Autowired private SysUserPasswordUtil userPasswordUtil; + @Autowired + private SysUserPasswordRepository userPasswordRDao; + /** * 添加用户信息 + * * @param model 用户信息 * @return 处理结果 */ @@ -147,7 +152,17 @@ public class PersonnelController extends CoreBaseController { user.setOrganizeNameRdd(userOrganize.getName()); user.setOrganizeCode(userOrganize.getOrganizeCode()); user.setUserInfoId(info.getId()); + user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); refreshSysUserPassword(user); + SysUser userSaved=personnelService.saveSysUser(user); + + // 添加保存passwordId进SysUser表 + SysUserPassword pwd = new SysUserPassword(); + pwd.setUserId(userSaved.getId()); + pwd.setUserPassword(userSaved.getUserLoginPassword()); + ConvertBean.serviceModelInitialize(pwd, userSaved.getUserName()); + SysUserPassword savedPassword = userPasswordRDao.save(pwd); + user.setUserLoginPasswordId(savedPassword.getId()); personnelService.saveSysUser(user); info.setUserId(user.getId()); @@ -167,6 +182,7 @@ public class PersonnelController extends CoreBaseController { /** * 修改用户信息 + * * @param model 用户信息 * @return 处理结果 */ @@ -256,6 +272,7 @@ public class PersonnelController extends CoreBaseController { /** * 修改用户信息 + * * @param model 用户信息 * @return 处理结果 */ @@ -290,6 +307,7 @@ public class PersonnelController extends CoreBaseController { /** * 获取用户信息 + * * @param id 用户id * @return 处理结果 */ @@ -330,6 +348,7 @@ public class PersonnelController extends CoreBaseController { /** * 获取账号信息 + * * @param id 用户id * @return 处理结果 */ @@ -359,6 +378,7 @@ public class PersonnelController extends CoreBaseController { /** * 删除用户信息 + * * @param id 用户id * @return 处理结果 */ @@ -389,6 +409,7 @@ public class PersonnelController extends CoreBaseController { /** * 根据id批量删除 + * * @param ids id数组 * @return 处理 */ @@ -434,6 +455,7 @@ public class PersonnelController extends CoreBaseController { /** * 删除账号信息 + * * @param id 用户账号id * @return 处理结果 */ @@ -464,6 +486,7 @@ public class PersonnelController extends CoreBaseController { /** * 根据id批量删除 + * * @param ids ids数组 * @return 处理结果 */ @@ -509,6 +532,7 @@ public class PersonnelController extends CoreBaseController { /** * 查询角色的所有角色权限关系 + * * @param model 查询条件 * @return 处理结果 */ @@ -521,7 +545,7 @@ public class PersonnelController extends CoreBaseController { List refs = personnelService.querySysRefUserDepartmentByUserDetailModel(model); if (refs != null && refs.size() > 0) { for (SysRefUserDepartment ref : refs) { - if(!idList.contains(ref.getUserId())){ + if (!idList.contains(ref.getUserId())) { idList.add(ref.getUserId()); } } @@ -538,6 +562,7 @@ public class PersonnelController extends CoreBaseController { /** * 查询角色的所有角色权限关系 + * * @param model 处理消息 * @return 处理结果 */ @@ -564,6 +589,7 @@ public class PersonnelController extends CoreBaseController { /** * 根据条件分页查询用户角色信息 + * * @param model 条件 * @return 处理结果 */ @@ -582,6 +608,7 @@ public class PersonnelController extends CoreBaseController { /** * 根据条件分页查询用户信息 + * * @param model 查询条件 * @return 处理结果 */ @@ -600,6 +627,7 @@ public class PersonnelController extends CoreBaseController { /** * 根据条件分页查询用户信息 + * * @param model 查询条件 * @return 处理结果 */ @@ -618,11 +646,12 @@ public class PersonnelController extends CoreBaseController { /** * 获取账号的所有组织信息集合 + * * @return 组织信息集合 */ @GetMapping(value = "/user/get-organize-list") @ApiOperation(value = "获取账号信息", notes = "获取用户账号的所有组织信息") - public ResultBean getUserOrganizeList(){ + public ResultBean getUserOrganizeList() { try { List list = AuthUtil.getSessionUser().getUser().getOrganizeList(); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultList(list); @@ -635,19 +664,19 @@ public class PersonnelController extends CoreBaseController { @PutMapping(value = "/user/session-organize/{id}") @ApiOperation(value = "修改用户会话组织信息", notes = "修改用户会话组织信息") - public ResultBean updateUserOrganizeList(@PathVariable("id") String idStr){ + public ResultBean updateUserOrganizeList(@PathVariable("id") String idStr) { try { ValidatorBean.checkIsNumber(idStr, "id为空"); List list = AuthUtil.getSessionUser().getUser().getOrganizeList(); Long id = Long.parseLong(idStr); SysOrganize organize = null; for (SysOrganize org : list) { - if(org.getId().equals(id)){ + if (org.getId().equals(id)) { organize = org; } } - if(organize == null){ + if (organize == null) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.IMPP.getCode()) .setErrorCode(ImppExceptionEnum.VARIFY_EXCEPTION.getCode()) @@ -658,7 +687,7 @@ public class PersonnelController extends CoreBaseController { // 会话工厂信息保存进Redis AuthUtil.setOrganize(organize); - personnelService.updateSysUserOrganize(AuthUtil.getSessionUser().getUser().getId(),organize.getId()); + personnelService.updateSysUserOrganize(AuthUtil.getSessionUser().getUser().getId(), organize.getId()); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(organize); } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); @@ -670,7 +699,7 @@ public class PersonnelController extends CoreBaseController { /** * 数据必填校验 * - * @param model 用户信息 + * @param model 用户信息 * @param isCheckId 是否校验 * @throws Exception */ @@ -689,10 +718,9 @@ public class PersonnelController extends CoreBaseController { .notNull("infoPositionId", model.getInfoPositionId()) .notNull("infoDepartmentId", model.getInfoDepartmentId()) .notNull("userDepartmentId", model.getUserDepartmentId()) - .notNull("userLoginName", model.getUserLoginName()) + .notNull("userLoginName", model.getUserLoginName()); // FIXME 松下移除邮箱校验 // .notNull("userEmail", model.getUserEmail()) - .notNull("userPhone", model.getUserPhone()); } /** @@ -708,16 +736,14 @@ public class PersonnelController extends CoreBaseController { .notNull("infoName", model.getInfoName()) .notNull("infoEmpNo", model.getInfoEmpNo()) .notNull("userDepartmentId", model.getUserDepartmentId()) - .notNull("userLoginName", model.getUserLoginName()) - .notNull("userEmail", model.getUserEmail()) - .notNull("userPhone", model.getUserPhone()); + .notNull("userLoginName", model.getUserLoginName()); } /** * 用户信息初始化 * * @param model 用户明细信息 - * @param user 用户信息 + * @param user 用户信息 * @throws Exception */ public void initUser(UserDetailModel model, SysUser user) throws Exception { @@ -737,8 +763,8 @@ public class PersonnelController extends CoreBaseController { /** * 关系刷新 * - * @param user 账户 - * @param info 用户信息 + * @param user 账户 + * @param info 用户信息 * @param model 用户模型 */ public void refreshRef(SysUser user, SysUserInfo info, UserDetailModel model) { @@ -781,57 +807,60 @@ public class PersonnelController extends CoreBaseController { /** * 根据组织code查询对应的组织信息 + * * @param code 组织代码 * @return 处理结果 */ @GetMapping(value = "/organize/get-code") @ApiOperation(value = "根据组织code查询对应的组织信息", notes = "根据组织code查询对应的组织信息") - public ResultBean getSysOrganizeByCode(String code){ - try{ + public ResultBean getSysOrganizeByCode(String code) { + try { SysOrganize org = new SysOrganize(); org.setOrganizeCode(code); SysOrganize sysOrganize = organizeService.get(org); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setResultObject(sysOrganize); - }catch(ImppBusiException busExcep){ + } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); - }catch(Exception e){ + } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } /** * 查询所有组织信息 + * * @return 处理结果 */ @GetMapping(value = "/organize/list") @ApiOperation(value = "查询所有组织信息", notes = "查询所有组织信息") - public ResultBean findSysOrganizeList(){ - try{ + public ResultBean findSysOrganizeList() { + try { List sysOrganize = organizeService.findAll(); return ResultBean.success("操作成功") .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) .setResultList(sysOrganize); - }catch(ImppBusiException busExcep){ + } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); - }catch(Exception e){ + } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } /** * 查询所有组织信息 + * * @return 处理结果 */ @GetMapping(value = "/license") @ApiOperation(value = "获取授权信息") - public ResultBean getLicense(){ - try{ + public ResultBean getLicense() { + try { return ResultBean.success("操作成功") .setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()) .setResultObject(ImppLicenseTool.getLicense()); - }catch(ImppBusiException busExcep){ + } catch (ImppBusiException busExcep) { return ResultBean.fail(busExcep); - }catch(Exception e){ + } catch (Exception e) { return ImppExceptionBuilder.newInstance().buildExceptionResult(e); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java index 89b9246..058ff60 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/controller/busi/SysLocaleResourceController.java @@ -13,10 +13,11 @@ import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.platform.common.util.FileContentTypeTool; import cn.estsh.i3plus.platform.common.util.PlatformConstWords; +import cn.estsh.i3plus.pojo.base.bean.ImppFile; import cn.estsh.i3plus.pojo.base.bean.ListPager; -import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; +import cn.estsh.i3plus.pojo.model.common.CloudPagerModel; import cn.estsh.i3plus.pojo.model.platform.MissResourceModel; import cn.estsh.i3plus.pojo.platform.bean.SysFile; import cn.estsh.i3plus.pojo.platform.bean.SysLocaleLanguage; @@ -26,7 +27,6 @@ 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.fileservice.ImppFileService; -import cn.estsh.i3plus.pojo.base.bean.ImppFile; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; @@ -128,7 +128,7 @@ public class SysLocaleResourceController extends CoreBaseController { */ @PutMapping(value = "/update") @ApiOperation(value = "修改语言资源",notes = "修改语言资源") - public ResultBean updateSysLocaleResource(SysLocaleResource sysLocaleResource) { + public ResultBean updateSysLocaleResource(@RequestBody SysLocaleResource sysLocaleResource) { try { //条件验证 ValidatorBean.beginValid(sysLocaleResource) @@ -202,15 +202,15 @@ public class SysLocaleResourceController extends CoreBaseController { /** * 语言资源复杂查询,分页,排序 - * @param sysLocaleResource 查询资源 * @param pager 分页数据 * @return 处理结果 */ - @GetMapping(value = "/query") + @PostMapping(value = "/query") @ApiOperation(value = "语言资源复杂查询,分页,排序",notes = "语言资源复杂查询,分页,排序") - public ResultBean querySysLocaleResourceByPager(SysLocaleResource sysLocaleResource, Pager pager){ + public ResultBean querySysLocaleResourceByPager(@RequestBody CloudPagerModel pager){ try { - ListPager sysLocaleLanguageListPager = sysLocaleResourceService.querySysLocaleResourceByPager(sysLocaleResource,pager); + ListPager sysLocaleLanguageListPager = + sysLocaleResourceService.querySysLocaleResourceByPager(pager.getObj(),pager.getPager()); return ResultBean.success("操作成功").setCode(ResourceEnumUtil.MESSAGE.SUCCESS.getCode()).setListPager(sysLocaleLanguageListPager); }catch(ImppBusiException busExcep){ return ResultBean.fail(busExcep); 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 91bf7bb..aace7cf 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 @@ -1,8 +1,13 @@ package cn.estsh.i3plus.core.apiservice.controller.busi; -import cn.estsh.i3plus.core.api.iservice.busi.*; -import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; +import cn.estsh.i3plus.core.api.iservice.busi.ICoreMemTreeService; +import cn.estsh.i3plus.core.api.iservice.busi.IPersonnelService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysMessageService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysUserInfoService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysUserPasswordService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.EncryptTool; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.tool.TimeTool; @@ -13,12 +18,16 @@ import cn.estsh.i3plus.pojo.base.common.Pager; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; import cn.estsh.i3plus.pojo.base.enumutil.ResourceEnumUtil; -import cn.estsh.i3plus.pojo.platform.bean.*; +import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import cn.estsh.i3plus.pojo.platform.bean.SysMessage; +import cn.estsh.i3plus.pojo.platform.bean.SysRefUserDepartment; +import cn.estsh.i3plus.pojo.platform.bean.SysRefUserRole; +import cn.estsh.i3plus.pojo.platform.bean.SysUser; +import cn.estsh.i3plus.pojo.platform.bean.SysUserInfo; import cn.estsh.impp.framework.base.controller.CoreBaseController; 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.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import io.swagger.annotations.Api; @@ -27,7 +36,13 @@ import org.apache.commons.lang3.RandomStringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageMailQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageMailQueueReceiver.java index fc6df08..62e5763 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageMailQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageMailQueueReceiver.java @@ -29,6 +29,8 @@ import org.springframework.context.annotation.Configuration; import java.io.IOException; import java.io.InputStream; +import static cn.estsh.i3plus.platform.common.util.CommonConstWords.CONFIG_APP_STATE_CHANGE_NOTICE; + /** * @Description : 邮件队列处理 * @Reference : @@ -119,7 +121,16 @@ public class MessageMailQueueReceiver { // 判断收件人类型 if (msg.getMessageReceiverType() != null) { - if (msg.getMessageReceiverType() == ImppEnumUtil.MESSAGE_RECEIVER_TYPE.EXTERNAL.getValue()) { + if (msg.getMessageReceiverType() == ImppEnumUtil.MESSAGE_RECEIVER_TYPE.URGENT.getValue() + && RedisCacheTool.getSysConfigBooleanVal(CONFIG_APP_STATE_CHANGE_NOTICE)) { + // 判断是否为系统紧急提示 微服注册状态提示 + mailUtil.setTo(RedisCacheTool.getSysConfigStrVal(PlatformConstWords.CONTACT_MAIL)); + try { + mailUtil.send(); + } catch (Exception e) { + saveSendErrorMsg(msg, RedisCacheTool.getSysConfigStrVal(PlatformConstWords.CONTACT_MAIL), e); + } + } else if (msg.getMessageReceiverType() == ImppEnumUtil.MESSAGE_RECEIVER_TYPE.EXTERNAL.getValue()) { //判断是否为外部邮件 mailUtil.setTo(StringUtils.split(msg.getMessageReceiversNameRdd(), ",")); try { 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 af43f3a..639f004 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 @@ -73,7 +73,7 @@ public class SystemLoginService implements ISystemLoginService { } public static void main(String[] args) { - System.out.println(1+2+"a"); + System.out.println(1 + 2 + "a"); } @Override @@ -138,6 +138,29 @@ public class SystemLoginService implements ISystemLoginService { } @Override + public SessionUser queryCheckNameUserLogin(UserToken userToken) { + //验证用户 + SysUser user = getUserLoginInfo(userToken.getLoginName()); + LOGGER.info("【验证用户checkUserLogin】{}", user); + //用户单地登录 + return packSessionUser(user, CommonEnumUtil.USER_TYPE.USER.getCode(), userToken.getLanguageCode()); + } + + @Override + public SessionUser queryCheckNameAdminLogin(AdminToken adminToken) { + //验证用户 + SysUser user = getUserLoginInfo(adminToken.getLoginName()); + //未抛异常,封装用户 + return packSessionUser(user, CommonEnumUtil.USER_TYPE.ADMIN.getCode(), adminToken.getLanguageCode()); + } + + @Override + public SessionUser queryCheckNameSaAdminLogin(SaAdminToken saAdminToken) { + SysUser user = getUserLoginInfo(saAdminToken.getLoginName()); + return packSessionUser(user, CommonEnumUtil.USER_TYPE.SA.getCode(), saAdminToken.getLanguageCode()); + } + + @Override @ApiOperation(value = "登录密码错误", notes = "登录密码错误记录错误次数功能") public Integer doLoginPasswordError(String loginName, String sessionId) { SysUser user = sysUserRDao.getByProperty(new String[]{"userLoginName", "isValid"}, 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 8ebc2d9..9c0f7f2 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 @@ -2,24 +2,32 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.base.login.strategy; import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService; -import cn.estsh.i3plus.core.api.iservice.busi.ILicenseClickService; import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; import cn.estsh.i3plus.platform.common.util.CommonConstWords; import cn.estsh.i3plus.pojo.base.bean.BaseThreadLocal; import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; import cn.estsh.i3plus.pojo.model.platform.SysLoginModel; import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import cn.estsh.i3plus.pojo.platform.bean.SysConfig; +import cn.estsh.i3plus.pojo.platform.bean.SysUser; import cn.estsh.impp.framework.boot.auth.AuthUtil; +import cn.estsh.impp.framework.boot.exception.ImppBusiException; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.RedisCacheTool; import cn.estsh.impp.framework.boot.util.ResultBean; import cn.estsh.impp.framework.boot.util.ValidatorBean; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.ExpiredCredentialsException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.function.BiFunction; import static cn.estsh.i3plus.platform.common.util.CommonConstWords.DEFAULT_LANGUAGE; @@ -37,9 +45,6 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { protected ImppRedis redisCore; @Autowired - private ILicenseClickService licenseClickService; - - @Autowired private ISysUserService userService; @Autowired @@ -65,6 +70,10 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { if (sessionMode != CommonEnumUtil.SESSION_MODE.SEIZE.getValue()) { AuthUtil.logout(); } + // 已经对用户名和密码做过验证了 + // 获取系统参数【密码过期时间】 进行密码有效时间判断 + userService.validatePasswordByLoginNameAndReturnUser(loginModel.getLoginName(),loginModel.getLoginPwd()); + validatePasswordIsExpired(loginModel.getLoginName()); SessionUser user = userService.loginUser( loginModel.getLoginName().trim(), @@ -84,4 +93,30 @@ public class DefaultLoginStrategy implements ISystemLoginStrategyService { return result; }; } + + private void validatePasswordIsExpired(String loginName) { + SysConfig passwordExpireSwitch = RedisCacheTool.getSysConfigByConfigCode(CommonConstWords.CONFIG_PWD_EXPIRE_SWITCH); + if (passwordExpireSwitch != null + && CommonEnumUtil.TRUE_OR_FALSE.TRUE.getValue() == Integer.parseInt(passwordExpireSwitch.getConfigValue())) { + SysConfig passwordExpireDays = RedisCacheTool.getSysConfigByConfigCode(CommonConstWords.CONFIG_PWD_EXPIRE_DAY_TIME); + if (passwordExpireDays != null && Integer.parseInt(passwordExpireDays.getConfigValue()) > 0) { + SysUser user = userService.getSysUserByLoginName(loginName); + if (StringUtils.isEmpty(user.getUserPasswordLastModifyTime())) { + throw new ExpiredCredentialsException("用户密码过期 请重新设置新密码"); + } else { + DateFormat df = new SimpleDateFormat(CommonConstWords.DATE_TIME_FORMAT_HH_MM_SS_RISK); + Date lastModifyDate = null; + try { + lastModifyDate = df.parse(user.getUserPasswordLastModifyTime()); + } catch (ParseException e) { + throw new ImppBusiException("验证用户密码登录时间,时间解析错误"); + } + long dayGap = (System.currentTimeMillis() - lastModifyDate.getTime()) / (60 * 60 * 1000 * 24); + if ((int) dayGap >= Integer.parseInt(passwordExpireDays.getConfigValue())) { + throw new ExpiredCredentialsException("用户密码过期 请重新设置新密码"); + } + } + } + } + } } 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 new file mode 100644 index 0000000..c78ce6e --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/login/strategy/NameLoginStrategy.java @@ -0,0 +1,92 @@ +package cn.estsh.i3plus.core.apiservice.serviceimpl.base.login.strategy; + +import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginService; +import cn.estsh.i3plus.core.api.iservice.base.ISystemLoginStrategyService; +import cn.estsh.i3plus.core.api.iservice.busi.ILicenseClickService; +import cn.estsh.i3plus.core.api.iservice.busi.ISysUserService; +import cn.estsh.i3plus.platform.common.tool.ServletRequestTool; +import cn.estsh.i3plus.platform.common.util.CommonConstWords; +import cn.estsh.i3plus.platform.common.util.PlatformConstWords; +import cn.estsh.i3plus.pojo.base.bean.BaseThreadLocal; +import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil; +import cn.estsh.i3plus.pojo.base.enumutil.ImppEnumUtil; +import cn.estsh.i3plus.pojo.model.platform.SysLoginModel; +import cn.estsh.i3plus.pojo.platform.bean.SessionUser; +import cn.estsh.impp.framework.boot.auth.AuthUtil; +import cn.estsh.impp.framework.boot.util.ImppRedis; +import cn.estsh.impp.framework.boot.util.RedisCacheTool; +import cn.estsh.impp.framework.boot.util.ResultBean; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.function.BiFunction; + +import static cn.estsh.i3plus.platform.common.util.CommonConstWords.DEFAULT_LANGUAGE; + +/** + * @author Wynne.Lu + * @date 2021/1/18 上午10:53 + * @desc + */ +@Lazy +@Slf4j +@Service +public class NameLoginStrategy implements ISystemLoginStrategyService { + + @Resource(name = "redisCore") + protected ImppRedis redisCore; + + @Autowired + private ILicenseClickService licenseClickService; + + @Autowired + private ISysUserService userService; + + @Autowired + private ISystemLoginService loginService; + + @Override + public BiFunction login() { + return (request, loginModel) -> { + licenseClickService.checkLicenseNumberLogin(); + + // TODO 后期移除,暂时用于避免自动登录后前台没有正确的传输组织代码信息 + if ("null".equals(loginModel.getLanguageCode())|| StringUtils.isEmpty(loginModel.getLanguageCode())) { + loginModel.setLanguageCode(DEFAULT_LANGUAGE); + } + + // 设置语言代码 + BaseThreadLocal.setData(BaseThreadLocal.LANGUAGE_CODE, loginModel.getLanguageCode()); + BaseThreadLocal.setData(PlatformConstWords.AUTH_LOGIN_STRATEGY, ImppEnumUtil.AUTH_LOGIN_STRATEGY.NAME.getCode()); + + int sessionMode = RedisCacheTool.getSysConfigIntVal(CommonConstWords.CONFIG_SESSION_MODE, CommonConstWords.CONFIG_SESSION_MODE_DEFAULT); + if (sessionMode != CommonEnumUtil.SESSION_MODE.SEIZE.getValue()) { + AuthUtil.logout(); + } + + SessionUser user = userService.loginUser( + loginModel.getLoginName().trim(), + loginModel.getLoginName().trim(), + loginModel.getLanguageCode(), + loginService.getLoginPlatform(request).getValue(), + loginModel.getDeviceId() + ); + + String redisKey = CommonConstWords.USER_LOGIN_ERROR + "_" + user.getUser().getId(); + redisCore.deleteKey(redisKey); + + ResultBean result = new ResultBean(true, AuthUtil.getSession().getId().toString(), AuthUtil.getSessionUser()); + result.setUrl("/"); + + AuthUtil.setOrganize(user.getUser().getOrganize()); + + return result; + }; + } +} 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 111ba52..f0800f5 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 @@ -15,14 +15,11 @@ import cn.estsh.impp.framework.base.service.CrudService; import cn.estsh.impp.framework.boot.auth.AuthUtil; import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder; import cn.estsh.impp.framework.boot.util.ValidatorBean; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; -import java.util.List; - /** * @Description : * @Reference : @@ -51,11 +48,11 @@ public class SysUserSavePasswordService extends CrudService imp @Override public void updatePassword(Long userId, String password, String newPwd) { SysUser user = userService.getSysUserById(userId); - ValidatorBean.checkNotNull(user,"不存在的用户信息"); + ValidatorBean.checkNotNull(user, "不存在的用户信息"); SysUserPassword userPassword = userPasswordRDao.getById(user.getUserLoginPasswordId()); - ValidatorBean.checkNotNull(userPassword,"不存在的用户密码信息"); - if(StringUtils.equals(userPassword.getUserPassword(),password)){ + ValidatorBean.checkNotNull(userPassword, "不存在的用户密码信息"); + if (StringUtils.equals(userPassword.getUserPassword(), password)) { throw ImppExceptionBuilder.newInstance() .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) @@ -68,27 +65,70 @@ public class SysUserSavePasswordService extends CrudService imp } @Override + public void updatePassword(String loginName, String password, String newPwd) { + SysUser user = userService.getSysUserByLoginName(loginName); + SysUserPassword userPassword = userPasswordRDao.getById(user.getUserLoginPasswordId()); + ValidatorBean.checkNotNull(userPassword, "不存在的用户密码信息"); + if (StringUtils.equals(userPassword.getUserPassword(), password)) { + throw ImppExceptionBuilder.newInstance() + .setSystemID(CommonEnumUtil.SOFT_TYPE.CORE.getCode()) + .setErrorCode(ImppExceptionEnum.NOT_CONFIG_EXCEPTION.getCode()) + .setErrorDetail("原始密码错误") + .setErrorSolution("请重新操作") + .build(); + } + + updatePassword(user.getId(), newPwd); + } + + @Override public void updatePassword(Long userId, String password) { SysUser user = userService.getSysUserById(userId); - ValidatorBean.checkNotNull(user,"不存在的用户信息"); + ValidatorBean.checkNotNull(user, "不存在的用户信息"); user.setUserLoginPassword(password); userPasswordUtil.checkPasswordSave(user); userPasswordRDao.updateByProperties( - new String[]{"userId","isDeleted"}, - new Object[]{user.getId(),CommonEnumUtil.IS_DEAL.NO.getValue()}, - new String[]{"isDeleted","modifyDatetime","modifyUser"}, + 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), AuthUtil.getSessionUser().getUserName()}); SysUserPassword pwd = new SysUserPassword(); pwd.setUserId(userId); pwd.setUserPassword(SysUserPasswordUtil.encoder(password)); - ConvertBean.serviceModelInitialize(pwd,AuthUtil.getSessionUser()); + ConvertBean.serviceModelInitialize(pwd, AuthUtil.getSessionUser()); + SysUserPassword save = userPasswordRDao.save(pwd); + + user.setUserLoginPasswordId(save.getId()); + user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); + ConvertBean.serviceModelUpdate(user, AuthUtil.getSessionUser().getUserName()); + userService.updateSysUser(user); + } + + @Override + public void updatePasswordWizoutSession(String loginName, String password, String newPwd) { + SysUser user = userService.validatePasswordByLoginNameAndReturnUser(loginName, password); + user.setUserLoginPassword(password); + 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}); + + SysUserPassword pwd = new SysUserPassword(); + pwd.setUserId(user.getId()); + pwd.setUserPassword(SysUserPasswordUtil.encoder(newPwd)); + ConvertBean.serviceModelInitialize(pwd, loginName); SysUserPassword save = userPasswordRDao.save(pwd); user.setUserLoginPasswordId(save.getId()); - ConvertBean.serviceModelUpdate(user,AuthUtil.getSessionUser().getUserName()); + user.setUserPasswordLastModifyTime(TimeTool.getNowTime(true)); + ConvertBean.serviceModelUpdate(user, loginName); userService.updateSysUser(user); } } 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 eff6bdc..2d6b3d7 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 @@ -1,9 +1,9 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.busi; import cn.estsh.i3plus.core.api.iservice.busi.*; -import cn.estsh.i3plus.core.apiservice.dao.IUserPermissionDao; import cn.estsh.i3plus.core.apiservice.util.SysUserPasswordUtil; import cn.estsh.i3plus.platform.common.convert.ConvertBean; +import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.i3plus.platform.common.tool.EncryptTool; import cn.estsh.i3plus.platform.common.tool.StringTool; import cn.estsh.i3plus.platform.common.tool.TimeTool; @@ -20,11 +20,15 @@ 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.platform.bean.*; -import cn.estsh.i3plus.pojo.platform.repository.*; +import cn.estsh.i3plus.pojo.platform.repository.SysLogUserLoginRepository; +import cn.estsh.i3plus.pojo.platform.repository.SysRefUserDepartmentRepository; +import cn.estsh.i3plus.pojo.platform.repository.SysRefUserPositionRepository; +import cn.estsh.i3plus.pojo.platform.repository.SysRefUserRoleRepository; +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.ImppExceptionBuilder; -import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum; import cn.estsh.impp.framework.boot.util.ImppRedis; import cn.estsh.impp.framework.boot.util.RedisCacheTool; import cn.estsh.impp.framework.boot.util.ValidatorBean; @@ -33,6 +37,7 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.CredentialsException; +import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -42,7 +47,15 @@ import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; @@ -124,7 +137,6 @@ public class SysUserService implements ISysUserService { BaseToken token = getToken(loginName, password, languageCode, loginPlatform); SessionUser sessionUser = AuthUtil.login(token); SysUser user = this.getSysUserByLoginName(loginName); - if (user == null) { throw new CredentialsException("用户不存在"); } @@ -713,6 +725,24 @@ public class SysUserService implements ISysUserService { return userRDao.findByHqlWhere(ddlPackBean); } + @Override + public SysUser validatePasswordByLoginNameAndReturnUser(String loginName, String password) { + SysUser userDb = getSysUserByLoginName(loginName); + ValidatorBean.checkNotNull(userDb, "不存在的用户信息"); + if (userDb.getUserLoginPasswordId() == null || userDb.getUserLoginPasswordId() <= 0) { + if (!userDb.getUserLoginPassword().equals(SysUserPasswordUtil.encoder(password))) { + throw new IncorrectCredentialsException("用户密码错误"); + } + } else { + SysUserPassword userPassword = userPasswordService.get(userDb.getUserLoginPasswordId()); + if (!userPassword.getUserPassword().equals(SysUserPasswordUtil.encoder(password))) { + throw new IncorrectCredentialsException("用户密码错误"); + } + } + + return userDb; + } + /** * 账号数据排序 * 创建时间 角色升序 diff --git a/pom.xml b/pom.xml index 9f8836b..2664636 100644 --- a/pom.xml +++ b/pom.xml @@ -129,6 +129,12 @@ i3plus.sdk + i3plus-sdk-dingtalk + ${project.version} + + + + i3plus.sdk i3plus-sdk-wechat ${project.version} @@ -189,7 +195,7 @@ mysql mysql-connector-java - 5.1.39 + 5.1.49