From edca1adbd033a680dbbcc2cbefee0326cc7199b5 Mon Sep 17 00:00:00 2001 From: wenc000 <450292408@qq.com> Date: Sat, 26 Oct 2019 15:55:49 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3BUG=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cloud-common-plugin-oauth/pom.xml | 6 +- .../java/com/cm/common/plugin/IApiConsts.java | 5 + .../service/menu/impl/MenuServiceImpl.java | 4 + .../oauth/service/user/IUserService.java | 10 + .../service/user/impl/UserServiceImpl.java | 26 +- .../plugin/oauth/timer/ClientTokenTimer.java | 33 ++ .../oauth/token/ClientTokenManager.java | 100 +++++ .../common/plugin/pojo/bos/ClientTokenBO.java | 88 ++++ .../cm/common/plugin/push/PushMessage.java | 85 ++++ .../common/plugin/utils/RestTemplateUtil.java | 100 ++++- cloud-common-plugin/pom.xml | 6 +- .../com/cm/common/aspect/ApiLogAspect.java | 62 ++- .../impl/SystemLoggerServiceImpl.java | 1 - cloud-common/pom.xml | 4 +- .../component/OAuthRestTemplateComponent.java | 404 ++++++++++++++++++ .../common/pojo/vos/push/PushMessageVO.java | 50 +++ .../common/token/app/entity/AppTokenUser.java | 42 +- cloud-security/pom.xml | 4 +- cloud-token-in/pom.xml | 4 +- cloud-token-out/pom.xml | 4 +- pom.xml | 2 +- 21 files changed, 992 insertions(+), 48 deletions(-) create mode 100644 cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/timer/ClientTokenTimer.java create mode 100644 cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/token/ClientTokenManager.java create mode 100644 cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/pojo/bos/ClientTokenBO.java create mode 100644 cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/push/PushMessage.java create mode 100644 cloud-common/src/main/java/com/cm/common/component/OAuthRestTemplateComponent.java create mode 100644 cloud-common/src/main/java/com/cm/common/pojo/vos/push/PushMessageVO.java diff --git a/cloud-common-plugin-oauth/pom.xml b/cloud-common-plugin-oauth/pom.xml index de009a1..5ac4907 100644 --- a/cloud-common-plugin-oauth/pom.xml +++ b/cloud-common-plugin-oauth/pom.xml @@ -5,20 +5,20 @@ cm-cloud com.cm - 1.0.0.RELEASE + 1.0.1-SNAPSHOT 4.0.0 单点登录客户端使用的通用jar包 cloud-common-plugin-oauth - 1.0.0.RELEASE + 1.0.1-SNAPSHOT com.cm cloud-common-plugin - 1.0.0.RELEASE + 1.0.1-SNAPSHOT diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/IApiConsts.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/IApiConsts.java index 8aae2bb..d7aaf48 100644 --- a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/IApiConsts.java +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/IApiConsts.java @@ -64,6 +64,11 @@ public interface IApiConsts { */ String LIST_USER_DEPARTMENT_USER_BY_ROLE = "%s/resource/user/listuserdepartmentuserbyrole/%s/%s"; + /** + * App获取用户所在部门用户列表(通过角色) + */ + String APP_LIST_USER_DEPARTMENT_USER_BY_ROLE = "%s/app/user/listuserdepartmentuserbyrole/%s/%s"; + /** * 获取用户所在部门用户列表(通过职位) */ diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/menu/impl/MenuServiceImpl.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/menu/impl/MenuServiceImpl.java index 27009b3..b4a43b3 100644 --- a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/menu/impl/MenuServiceImpl.java +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/menu/impl/MenuServiceImpl.java @@ -3,11 +3,13 @@ package com.cm.common.plugin.oauth.service.menu.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cm.common.base.AbstractService; +import com.cm.common.component.OAuthRestTemplateComponent; import com.cm.common.config.properties.ApiPathProperties; import com.cm.common.exception.AccessTokenException; import com.cm.common.exception.SearchException; import com.cm.common.plugin.IApiConsts; import com.cm.common.plugin.oauth.service.menu.IMenuService; +import com.cm.common.plugin.oauth.token.ClientTokenManager; import com.cm.common.plugin.utils.RestTemplateUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +33,8 @@ public class MenuServiceImpl extends AbstractService implements IMenuService { @Autowired private RestTemplateUtil restTemplateUtil; @Autowired + private OAuthRestTemplateComponent oAuthRestTemplateComponent; + @Autowired private ApiPathProperties apiPathProperties; @Override diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/IUserService.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/IUserService.java index 9d8f334..67a798a 100644 --- a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/IUserService.java +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/IUserService.java @@ -98,6 +98,15 @@ public interface IUserService { */ JSONArray listUserDepartmentUserByRole(Map params) throws AccessTokenException, SearchException; + /** + * APP获取用户所在部门用户列表(通过角色) + * + * @param token + * @param userParams + * @return + */ + JSONArray listUserDepartmentUserByRole(String token, Map userParams) throws SearchException; + /** * 获取用户所在部门用户列表(通过职位) * @@ -118,4 +127,5 @@ public interface IUserService { */ JSONObject getUserDetail(Map params) throws AccessTokenException, SearchException; + JSONArray listRoleUsers(String accessToken, Map params) throws AccessTokenException, SearchException; } diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/impl/UserServiceImpl.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/impl/UserServiceImpl.java index 1b09d10..484a67d 100644 --- a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/impl/UserServiceImpl.java +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/service/user/impl/UserServiceImpl.java @@ -3,14 +3,13 @@ package com.cm.common.plugin.oauth.service.user.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.cm.common.base.AbstractService; +import com.cm.common.component.OAuthRestTemplateComponent; import com.cm.common.config.properties.ApiPathProperties; import com.cm.common.exception.AccessTokenException; import com.cm.common.exception.SearchException; -import com.cm.common.exception.TokenException; import com.cm.common.plugin.IApiConsts; import com.cm.common.plugin.oauth.service.user.IUserService; import com.cm.common.plugin.utils.RestTemplateUtil; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -33,6 +32,8 @@ public class UserServiceImpl extends AbstractService implements IUserService { private RestTemplateUtil restTemplateUtil; @Autowired private ApiPathProperties apiPathProperties; + @Autowired + private OAuthRestTemplateComponent oAuthRestTemplateComponent; @Override public JSONArray listDepartmentUsers(Map params) throws AccessTokenException, SearchException { @@ -130,6 +131,15 @@ public class UserServiceImpl extends AbstractService implements IUserService { return JSONArray.parseArray(result); } + @Override + public JSONArray listUserDepartmentUserByRole(String token, Map params) throws SearchException { + String result = restTemplateUtil.doGetFormForApp(token, String.format(IApiConsts.APP_LIST_USER_DEPARTMENT_USER_BY_ROLE, apiPathProperties.getUserCenter(), params.get("userId").toString(), params.get("roleId").toString()), params); + if (result == null || result.isEmpty()) { + throw new SearchException("获取人员列表失败"); + } + return JSONArray.parseArray(result); + } + @Override public JSONArray listUserDepartmentUserByPosition(Map params) throws AccessTokenException, SearchException { String result = restTemplateUtil.doPostForm(String.format(IApiConsts.LIST_USER_DEPARTMENT_USER_BY_POSITION, apiPathProperties.getUserCenter(), params.get("userId").toString(), params.get("positionId").toString()), params); @@ -154,4 +164,16 @@ public class UserServiceImpl extends AbstractService implements IUserService { return JSONObject.parseObject(result); } + @Override + public JSONArray listRoleUsers(String accessToken, Map params) throws AccessTokenException, SearchException { + String result = oAuthRestTemplateComponent.doPostFormForOAuth2Client(accessToken, String.format(IApiConsts.LIST_ROLE_USER, apiPathProperties.getUserCenter(), params.get("roleId").toString()), params); + if (result == null) { + throw new AccessTokenException("认证失败"); + } + if (result.isEmpty()) { + throw new SearchException("获取人员列表失败"); + } + return JSONArray.parseArray(result); + } + } diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/timer/ClientTokenTimer.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/timer/ClientTokenTimer.java new file mode 100644 index 0000000..b31da09 --- /dev/null +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/timer/ClientTokenTimer.java @@ -0,0 +1,33 @@ +package com.cm.common.plugin.oauth.timer; + +import com.cm.common.config.properties.OauthClientProperties; +import com.cm.common.config.properties.OauthProperties; +import com.cm.common.plugin.pojo.bos.ClientTokenBO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: ClientTokenTimer + * @Description: 客户端token定时器 + * @Author: WangGeng + * @Date: 2019/10/16 12:13 上午 + * @Version: 1.0 + **/ +@Configuration +@EnableScheduling +public class ClientTokenTimer { + + @Autowired + private OauthProperties oauthProperties; + @Autowired + private OauthClientProperties oauthClientProperties; + private static ClientTokenBO clientTokenBO; + + public void refreshToken() { + } + +} diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/token/ClientTokenManager.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/token/ClientTokenManager.java new file mode 100644 index 0000000..2d4a245 --- /dev/null +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/oauth/token/ClientTokenManager.java @@ -0,0 +1,100 @@ +package com.cm.common.plugin.oauth.token; + +import com.alibaba.fastjson.JSONObject; +import com.cm.common.config.properties.OauthClientProperties; +import com.cm.common.config.properties.OauthProperties; +import com.cm.common.plugin.pojo.bos.ClientTokenBO; +import com.cm.common.plugin.utils.RestTemplateUtil; +import com.hazelcast.core.Client; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.parameters.P; + +import java.util.HashMap; +import java.util.Map; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: ClientTokenManager + * @Description: 客户单token + * @Author: WangGeng + * @Date: 2019/10/16 12:22 上午 + * @Version: 1.0 + **/ +public class ClientTokenManager { + + private static final Logger LOG = LoggerFactory.getLogger(ClientTokenManager.class); + private static ClientTokenManager clientTokenManager = ClientTokenBuilder.clientTokenManager; + private ClientTokenBO clientToken; + private RestTemplateUtil restTemplateUtil; + private OauthProperties oauthProperties; + private OauthClientProperties oauthClientProperties; + + private ClientTokenManager() { + } + + public static ClientTokenManager getInstance() { + return clientTokenManager; + } + + public static void setClientTokenManager(ClientTokenManager clientTokenManager) { + ClientTokenManager.clientTokenManager = clientTokenManager; + } + + public ClientTokenBO getClientToken() { + if (clientToken == null || (System.currentTimeMillis() - clientToken.getCreateTime()) / 1000 >= clientToken.getExpiresIn()) { + LOG.debug("客户端Token失效,获取token"); + Map params = new HashMap<>(4); + params.put("grant_type", "client_credentials"); + params.put("client_id", oauthClientProperties.getClientId()); + params.put("client_secret", oauthClientProperties.getClientSecret()); + params.put("scope", "all"); + String result = restTemplateUtil.doPostFormNormal(String.format("%s/oauth/token", oauthProperties.getOauthServer()), params); + if (StringUtils.isBlank(result)) { + LOG.error("客户端获取token失效"); + } else { + JSONObject accessTokenObject = JSONObject.parseObject(result); + clientToken = new ClientTokenBO(); + clientToken.setAccessToken(accessTokenObject.getString("access_token")); + clientToken.setTokenType(accessTokenObject.getString("token_type")); + clientToken.setExpiresIn(accessTokenObject.getInteger("expires_in")); + clientToken.setScope(accessTokenObject.getString("scope")); + clientToken.setJti(accessTokenObject.getString("jti")); + clientToken.setCreateTime(System.currentTimeMillis()); + } + } + return clientToken; + } + + public RestTemplateUtil getRestTemplateUtil() { + return restTemplateUtil; + } + + public void setRestTemplateUtil(RestTemplateUtil restTemplateUtil) { + this.restTemplateUtil = restTemplateUtil; + } + + public OauthProperties getOauthProperties() { + return oauthProperties; + } + + public void setOauthProperties(OauthProperties oauthProperties) { + this.oauthProperties = oauthProperties; + } + + public OauthClientProperties getOauthClientProperties() { + return oauthClientProperties; + } + + public void setOauthClientProperties(OauthClientProperties oauthClientProperties) { + this.oauthClientProperties = oauthClientProperties; + } + + private static class ClientTokenBuilder { + public static ClientTokenManager clientTokenManager = new ClientTokenManager(); + } + +} diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/pojo/bos/ClientTokenBO.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/pojo/bos/ClientTokenBO.java new file mode 100644 index 0000000..58ac917 --- /dev/null +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/pojo/bos/ClientTokenBO.java @@ -0,0 +1,88 @@ +package com.cm.common.plugin.pojo.bos; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: ClientTokenBO + * @Description: 客户端token + * @Author: WangGeng + * @Date: 2019/10/16 12:17 上午 + * @Version: 1.0 + **/ +public class ClientTokenBO { + + private String accessToken; + private String tokenType; + private int expiresIn; + private String scope; + private String jti; + private long createTime; + + public String getAccessToken() { + return accessToken == null ? "" : accessToken.trim(); + } + + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public String getTokenType() { + return tokenType == null ? "" : tokenType.trim(); + } + + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + + public int getExpiresIn() { + return expiresIn; + } + + public void setExpiresIn(int expiresIn) { + this.expiresIn = expiresIn; + } + + public String getScope() { + return scope == null ? "" : scope.trim(); + } + + public void setScope(String scope) { + this.scope = scope; + } + + public String getJti() { + return jti == null ? "" : jti.trim(); + } + + public void setJti(String jti) { + this.jti = jti; + } + + public long getCreateTime() { + return createTime; + } + + public void setCreateTime(long createTime) { + this.createTime = createTime; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"accessToken\":") + .append("\"").append(accessToken).append("\""); + sb.append(",\"tokenType\":") + .append("\"").append(tokenType).append("\""); + sb.append(",\"expiresIn\":") + .append(expiresIn); + sb.append(",\"scope\":") + .append("\"").append(scope).append("\""); + sb.append(",\"jti\":") + .append("\"").append(jti).append("\""); + sb.append(",\"createTime\":") + .append(createTime); + sb.append('}'); + return sb.toString(); + } +} diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/push/PushMessage.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/push/PushMessage.java new file mode 100644 index 0000000..da61651 --- /dev/null +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/push/PushMessage.java @@ -0,0 +1,85 @@ +package com.cm.common.plugin.push; + +import com.cm.common.component.OAuthRestTemplateComponent; +import com.cm.common.config.properties.ApiPathProperties; +import com.cm.common.config.properties.OauthClientProperties; +import com.cm.common.plugin.utils.RestTemplateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.*; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: PushMessage + * @Description: + * @Author: WangGeng + * @Date: 2019/10/14 4:07 下午 + * @Version: 1.0 + **/ +@Component +public class PushMessage { + private static final Logger LOG = LoggerFactory.getLogger(PushMessage.class); + /** + * APP推送的地址 + */ + private static final String APP_PUSH_URL = "%s/app/push/pushmessage/%s"; + /** + * 客户端推送地址 + */ + private static final String RESOURCE_PUSH_CONTENT_URL = "%s/resource/push/pushmessagetouserwithcontent"; + @Autowired + private ApiPathProperties apiPathProperties; + @Autowired + private RestTemplateUtil restTemplateUtil; + @Autowired + private OAuthRestTemplateComponent oAuthRestTemplateComponent; + + private static Executor executor = new ThreadPoolExecutor(2, 10, 60000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>()); + + /** + * app推送 + * + * @param token + * @param userId + * @param title + * @param content + */ + public void appPush(String token, String userId, String title, String content) { + Map params = new HashMap<>(2); + params.put("title", title); + params.put("content", content); + executor.execute(() -> { + String result = restTemplateUtil.doPostJsonForApp(token, String.format(APP_PUSH_URL, apiPathProperties.getUserCenter(), userId), params); + if (result == null) { + LOG.error("消息推送失败"); + } else { + LOG.info(result); + } + }); + } + + /** + * 客户端推送 + * + * @param token + * @param params + */ + public void clientPush(String token, Map params) { + executor.execute(() -> { + String result = oAuthRestTemplateComponent.doPostJsonForOAuth2Client(token, String.format(RESOURCE_PUSH_CONTENT_URL, apiPathProperties.getUserCenter()), params); + if (result == null) { + LOG.error("消息推送失败"); + } else { + LOG.info(result); + } + }); + } + +} diff --git a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/utils/RestTemplateUtil.java b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/utils/RestTemplateUtil.java index e4d12ed..5c96ec6 100644 --- a/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/utils/RestTemplateUtil.java +++ b/cloud-common-plugin-oauth/src/main/java/com/cm/common/plugin/utils/RestTemplateUtil.java @@ -2,14 +2,12 @@ package com.cm.common.plugin.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; -import com.cm.common.config.properties.ApiPathProperties; import com.cm.common.config.properties.OauthClientProperties; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties; import org.springframework.http.*; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.security.oauth2.client.OAuth2ClientContext; @@ -19,7 +17,6 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; -import java.util.HashMap; import java.util.Map; /** @@ -62,6 +59,44 @@ public class RestTemplateUtil { } } + /** + * 执行GET请求 + * + * @param url + * @param params + * @return + */ + public String doGetFormForApp(String token, String url, Map params) { + RestTemplate restTemplate = getRestTemplate(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + httpHeaders.add("token", token); + HttpEntity httpEntity = new HttpEntity<>(null, httpHeaders); + try { + return getResponse(restTemplate.exchange(String.format("%s?%s", url, queryParams(params)), HttpMethod.GET, httpEntity, String.class)); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + return null; + } + } + + /** + * 正常GET的form表单 + * + * @param url + * @param params + * @return + */ + public String doGetFormNormal(String url, Map params) { + RestTemplate restTemplate = getRestTemplate(); + try { + return getResponse(restTemplate.getForEntity(String.format("%s?%s", url, queryParams(params)), String.class, params)); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + return null; + } + } + /** * post提交 form 数据 * @@ -81,12 +116,69 @@ public class RestTemplateUtil { MultiValueMap queryParams = new LinkedMultiValueMap<>(); queryParams.add("access_token", accessToken); + return doPost(url, params, httpHeaders, queryParams); + } + + /** + * app发送post表单请求 + * + * @param token + * @param url + * @param params + * @return + */ + public String doPostFormForApp(String token, String url, Map params) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + httpHeaders.add("token", token); + + MultiValueMap queryParams = new LinkedMultiValueMap<>(); + return doPost(url, params, httpHeaders, queryParams); + } + + /** + * 正常POST的form表单 + * + * @param url + * @param params + * @return + */ + public String doPostFormNormal(String url, Map params) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + + MultiValueMap queryParams = new LinkedMultiValueMap<>(); + return doPost(url, params, httpHeaders, queryParams); + } + + /** + * 发送post请求 + * + * @param url + * @param params + * @param httpHeaders + * @param queryParams + * @return + */ + private String doPost(String url, Map params, HttpHeaders httpHeaders, MultiValueMap queryParams) { for (Map.Entry kv : params.entrySet()) { queryParams.add(kv.getKey(), kv.getValue()); } - HttpEntity> httpEntity = new HttpEntity<>(queryParams, httpHeaders); + RestTemplate restTemplate = getRestTemplate(); + try { + return getResponse(restTemplate.postForEntity(url, httpEntity, String.class)); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + return null; + } + } + public String doPostJsonForApp(String token, String url, Map params) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + httpHeaders.add("token", token); + HttpEntity httpEntity = new HttpEntity<>(JSONObject.toJSONString(params), httpHeaders); RestTemplate restTemplate = getRestTemplate(); try { return getResponse(restTemplate.postForEntity(url, httpEntity, String.class)); diff --git a/cloud-common-plugin/pom.xml b/cloud-common-plugin/pom.xml index 9c53af4..0000ee1 100644 --- a/cloud-common-plugin/pom.xml +++ b/cloud-common-plugin/pom.xml @@ -5,18 +5,18 @@ cm-cloud com.cm - 1.0.0.RELEASE + 1.0.1-SNAPSHOT 4.0.0 cloud-common-plugin - 1.0.0.RELEASE + 1.0.1-SNAPSHOT com.cm cloud-common - 1.0.0.RELEASE + 1.0.1-SNAPSHOT diff --git a/cloud-common-plugin/src/main/java/com/cm/common/aspect/ApiLogAspect.java b/cloud-common-plugin/src/main/java/com/cm/common/aspect/ApiLogAspect.java index a7ab7d2..038a70a 100644 --- a/cloud-common-plugin/src/main/java/com/cm/common/aspect/ApiLogAspect.java +++ b/cloud-common-plugin/src/main/java/com/cm/common/aspect/ApiLogAspect.java @@ -6,6 +6,7 @@ import com.cm.common.component.SecurityComponent; import com.cm.common.plugin.pojo.vos.systemlogger.SystemLoggerVO; import com.cm.common.plugin.service.systemlogger.ISystemLoggerService; import com.cm.common.pojo.bos.UserInfoBO; +import com.cm.common.utils.DateUtil; import com.cm.common.utils.RequestUtil; import com.cm.common.utils.UUIDUtil; import com.cm.common.utils.WMapUtil; @@ -45,7 +46,7 @@ public class ApiLogAspect { @Around("apiCutPoint()") public Object apiLogAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { - return logAround(proceedingJoinPoint); + return logAroundForApi(proceedingJoinPoint); } /** @@ -57,7 +58,7 @@ public class ApiLogAspect { @Around("resourceCutPoint()") public Object resourcesLogAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { - return logAround(proceedingJoinPoint); + return logAroundForResource(proceedingJoinPoint); } /** @@ -66,7 +67,7 @@ public class ApiLogAspect { * @param proceedingJoinPoint * @return */ - private Object logAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + private Object logAroundForApi(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { HttpServletRequest request = RequestUtil.getRequest(); Signature signature = proceedingJoinPoint.getSignature(); StringBuilder paramValue = new StringBuilder(); @@ -92,6 +93,7 @@ public class ApiLogAspect { result = proceedingJoinPoint.proceed(); long endTime = System.currentTimeMillis(); long usedTime = endTime - startTime; + String currentTime = DateUtil.getTime(); SystemLoggerVO systemLoggerVO = new SystemLoggerVO(); systemLoggerVO.setHost(request.getRemoteAddr()); systemLoggerVO.setPort(request.getLocalPort()); @@ -108,8 +110,8 @@ public class ApiLogAspect { systemLoggerVO.setResponseResult(result == null ? "null" : JSON.toJSONString(result)); Map params = WMapUtil.beanToMapObj(systemLoggerVO); params.put("systemLoggerId", UUIDUtil.getUUID()); - params.put("gmtCreate", usedTime); - params.put("gmtModified", endTime); + params.put("gmtCreate", currentTime); + params.put("gmtModified", currentTime); UserInfoBO userInfoBO = securityComponent.getCurrentUser(); if (null != userInfoBO) { String userId = userInfoBO.getUserId(); @@ -124,4 +126,54 @@ public class ApiLogAspect { return result; } + private Object logAroundForResource(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { + HttpServletRequest request = RequestUtil.getRequest(); + String accessToken = request.getParameter("accessToken"); + Signature signature = proceedingJoinPoint.getSignature(); + StringBuilder paramValue = new StringBuilder(); + Object[] args = proceedingJoinPoint.getArgs(); + for (Object arg : args) { + // 去除无效的参数 + if (arg instanceof WebStatFilter.StatHttpServletResponseWrapper) { + continue; + } + if (paramValue.length() > 0) { + paramValue.append("_wg_"); + } + try { + paramValue.append(JSON.toJSONString(arg)); + } catch (Exception e) { + e.printStackTrace(); + } + } + Object result; + long startTime = System.currentTimeMillis(); + result = proceedingJoinPoint.proceed(); + long endTime = System.currentTimeMillis(); + long usedTime = endTime - startTime; + String currentTime = DateUtil.getTime(); + SystemLoggerVO systemLoggerVO = new SystemLoggerVO(); + systemLoggerVO.setHost(request.getRemoteAddr()); + systemLoggerVO.setPort(request.getLocalPort()); + systemLoggerVO.setRequestIp(RequestUtil.getRequestIp()); + systemLoggerVO.setContextPath(request.getContextPath()); + systemLoggerVO.setUri(request.getRequestURI().replace(request.getContextPath(), "")); + systemLoggerVO.setParameterValues(paramValue.toString()); + systemLoggerVO.setClassNameFull(signature.getDeclaringTypeName()); + systemLoggerVO.setClassName(signature.getDeclaringType().getSimpleName()); + systemLoggerVO.setMethodName(signature.getName()); + systemLoggerVO.setStartTime(startTime); + systemLoggerVO.setEndTime(endTime); + systemLoggerVO.setUsedTime(usedTime); + systemLoggerVO.setResponseResult(result == null ? "null" : JSON.toJSONString(result)); + Map params = WMapUtil.beanToMapObj(systemLoggerVO); + params.put("systemLoggerId", UUIDUtil.getUUID()); + params.put("gmtCreate", currentTime); + params.put("gmtModified", currentTime); + params.put("creator", accessToken); + params.put("creatorName", accessToken); + systemLoggerService.saveSystemLogger(params); + return result; + } + } diff --git a/cloud-common-plugin/src/main/java/com/cm/common/plugin/service/systemlogger/impl/SystemLoggerServiceImpl.java b/cloud-common-plugin/src/main/java/com/cm/common/plugin/service/systemlogger/impl/SystemLoggerServiceImpl.java index c2261b3..bea2a6f 100755 --- a/cloud-common-plugin/src/main/java/com/cm/common/plugin/service/systemlogger/impl/SystemLoggerServiceImpl.java +++ b/cloud-common-plugin/src/main/java/com/cm/common/plugin/service/systemlogger/impl/SystemLoggerServiceImpl.java @@ -37,7 +37,6 @@ public class SystemLoggerServiceImpl extends AbstractService implements ISystemL @Override public SuccessResult saveSystemLogger(Map params) throws SaveException { - setSaveInfo(params); systemLoggerDao.saveSystemLogger(params); return new SuccessResult(); } diff --git a/cloud-common/pom.xml b/cloud-common/pom.xml index d1352f2..ca5f8c5 100644 --- a/cloud-common/pom.xml +++ b/cloud-common/pom.xml @@ -5,12 +5,12 @@ cm-cloud com.cm - 1.0.0.RELEASE + 1.0.1-SNAPSHOT 4.0.0 cloud-common - 1.0.0.RELEASE + 1.0.1-SNAPSHOT diff --git a/cloud-common/src/main/java/com/cm/common/component/OAuthRestTemplateComponent.java b/cloud-common/src/main/java/com/cm/common/component/OAuthRestTemplateComponent.java new file mode 100644 index 0000000..dffe25f --- /dev/null +++ b/cloud-common/src/main/java/com/cm/common/component/OAuthRestTemplateComponent.java @@ -0,0 +1,404 @@ +package com.cm.common.component; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.cm.common.config.properties.OauthClientProperties; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.*; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.security.oauth2.client.OAuth2ClientContext; +import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.util.HashMap; +import java.util.Map; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: OAuthRestTemplateUtil + * @Description: OAuth的Rest请求工具类 + * @Author: WangGeng + * @Date: 2019/10/16 10:17 下午 + * @Version: 1.0 + **/ +@Component +public class OAuthRestTemplateComponent { + + private static Logger LOG = LoggerFactory.getLogger(OAuthRestTemplateComponent.class); + @Qualifier("oauth2ClientContext") + private OAuth2ClientContext oAuth2ClientContext; + @Autowired + private OauthClientProperties oauthClientProperties; + + /** + * GET的FORM表单请求 + * + * @param url + * @param params + * @return + */ + public String doGetForm(String url, Map params) { + params = getParams(params); + HttpHeaders httpHeaders = getFormHeader(); + return getGetResponse(httpHeaders, url, params); + } + + /** + * Oauth2客户端执行GET的FORM表单请求 + * + * @param accessToken + * @param url + * @param params + * @return + */ + public String doGetFormForOAuth2Client(String accessToken, String url, Map params) { + params = getParams(params); + params.put("access_token", accessToken); + HttpHeaders httpHeaders = getFormHeader(); + return getGetResponse(httpHeaders, url, params); + } + + /** + * Oauth2上下文执行GET的FORM表单请求(用户登录后) + * + * @param url + * @param params + * @return + */ + public String doGetFormForOAuth2Context(String url, Map params) { + params = getParams(params); + refreshOAuth2ContextAccessToken(); + String accessToken = getOAuth2ContextAccessToken(); + if (StringUtils.isBlank(accessToken)) { + return null; + } + params.put("access_token", accessToken); + HttpHeaders httpHeaders = getFormHeader(); + return getGetResponse(httpHeaders, url, params); + } + + /** + * APP执行GET的FORM表单请求 + * + * @param token + * @param url + * @param params + * @return + */ + public String doGetFormForApp(String token, String url, Map params) { + params = getParams(params); + HttpHeaders httpHeaders = getFormHeader(); + httpHeaders.add("token", token); + return getGetResponse(httpHeaders, url, params); + } + + /** + * 获取GET的FORM表单请求的结果 + * + * @param httpHeaders + * @param url + * @param params + * @return + */ + private String getGetResponse(HttpHeaders httpHeaders, String url, Map params) { + HttpEntity httpEntity = new HttpEntity<>(null, httpHeaders); + RestTemplate restTemplate = getRestTemplate(); + try { + return getResponse(restTemplate.exchange(String.format("%s?%s", url, getQueryParams(params)), HttpMethod.GET, httpEntity, String.class)); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + return null; + } + } + + /** + * POST的FORM表单请求 + * + * @param url + * @param params + * @return + */ + public String doPostForm(String url, Map params) { + params = getParams(params); + HttpHeaders httpHeaders = getFormHeader(); + return getPostFormResponse(httpHeaders, url, params); + } + + /** + * POST的JSON请求 + * + * @param url + * @param params + * @return + */ + public String doPostJson(String url, Map params) { + HttpHeaders httpHeaders = getJsonHeader(); + return getPostJsonResponse(httpHeaders, url, params); + } + + /** + * Oauth2客户端执行POST的FORM表单请求 + * + * @param accessToken + * @param url + * @param params + * @return + */ + public String doPostFormForOAuth2Client(String accessToken, String url, Map params) { + params = getParams(params); + HttpHeaders httpHeaders = getFormHeader(); + return getPostFormResponse(httpHeaders, String.format("%s?access_token=%s", url, accessToken), params); + } + + /** + * Oauth2客户端执行POST的JSON表单请求 + * + * @param token + * @param url + * @param params + * @return + */ + public String doPostJsonForOAuth2Client(String accessToken, String url, Map params) { + HttpHeaders httpHeaders = getJsonHeader(); + return getPostJsonResponse(httpHeaders, String.format("%s?access_token=%s", url, accessToken), params); + } + + /** + * Oauth2上下文执行POST的FORM表单请求(用户登录后) + * + * @param url + * @param params + * @return + */ + public String doPostFormForOAuth2Context(String url, Map params) { + params = getParams(params); + refreshOAuth2ContextAccessToken(); + String accessToken = getOAuth2ContextAccessToken(); + if (StringUtils.isBlank(accessToken)) { + return null; + } + HttpHeaders httpHeaders = getFormHeader(); + return getPostFormResponse(httpHeaders, String.format("%s?access_token=%s", url, accessToken), params); + } + + /** + * Oauth2上下文执行POST的JSON请求(用户登录后) + * + * @param token + * @param url + * @param params + * @return + */ + public String doPostJsonForOAuth2Context(String token, String url, Map params) { + params = getParams(params); + refreshOAuth2ContextAccessToken(); + String accessToken = getOAuth2ContextAccessToken(); + if (StringUtils.isBlank(accessToken)) { + return null; + } + HttpHeaders httpHeaders = getJsonHeader(); + return getPostJsonResponse(httpHeaders, String.format("%s?access_token=%s", url, accessToken), params); + } + + /** + * APP执行POST的FORM表单请求 + * + * @param token + * @param url + * @param params + * @return + */ + public String doPostFormForApp(String token, String url, Map params) { + params = getParams(params); + HttpHeaders httpHeaders = getFormHeader(); + httpHeaders.add("token", token); + return getPostFormResponse(httpHeaders, url, params); + } + + /** + * APP执行POST的JSON请求 + * + * @param token + * @param url + * @param params + * @return + */ + public String doPostJsonForApp(String token, String url, Map params) { + HttpHeaders httpHeaders = getJsonHeader(); + httpHeaders.add("token", token); + return getPostJsonResponse(httpHeaders, url, params); + } + + /** + * 获取POST的FORM表单请求的结果 + * + * @param httpHeaders + * @param url + * @param params + * @return + */ + private String getPostFormResponse(HttpHeaders httpHeaders, String url, Map params) { + MultiValueMap queryParams = new LinkedMultiValueMap<>(); + for (Map.Entry kv : params.entrySet()) { + queryParams.add(kv.getKey(), kv.getValue()); + } + HttpEntity> httpEntity = new HttpEntity<>(queryParams, httpHeaders); + return getPostResponse(httpEntity, url); + } + + /** + * 获取POST的JSON请求的结果 + * + * @param httpHeaders + * @param url + * @param params + * @return + */ + private String getPostJsonResponse(HttpHeaders httpHeaders, String url, Map params) { + HttpEntity httpEntity = new HttpEntity<>(JSONObject.toJSONString(params), httpHeaders); + return getPostResponse(httpEntity, url); + } + + /** + * 获取POST请求结果 + * + * @param httpEntity + * @param url + * @return + */ + private String getPostResponse(HttpEntity httpEntity, String url) { + RestTemplate restTemplate = getRestTemplate(); + try { + return getResponse(restTemplate.postForEntity(url, httpEntity, String.class)); + } catch (Exception e) { + LOG.error(e.getMessage(), e); + return null; + } + } + + /** + * 获取参数 + * + * @param params + * @return + */ + private Map getParams(Map params) { + if (params == null) { + return new HashMap<>(0); + } + return params; + } + + /** + * 获取form表单请求header + * + * @return + */ + private HttpHeaders getFormHeader() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + return httpHeaders; + } + + /** + * 获取json请求header + * + * @return + */ + private HttpHeaders getJsonHeader() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + return httpHeaders; + } + + /** + * 获取restTemplate + * + * @return + */ + private RestTemplate getRestTemplate() { + SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); + simpleClientHttpRequestFactory.setConnectTimeout(20 * 1000); + simpleClientHttpRequestFactory.setReadTimeout(60 * 1000); + return new RestTemplate(simpleClientHttpRequestFactory); + } + + /** + * 返回参数 + * + * @param responseEntity + * @return + */ + private String getResponse(ResponseEntity responseEntity) { + LOG.debug(">>>> 请求状态:" + responseEntity.getStatusCodeValue()); + if (HttpStatus.OK.value() == responseEntity.getStatusCodeValue()) { + return responseEntity.getBody(); + } else if (HttpStatus.UNAUTHORIZED.value() == responseEntity.getStatusCodeValue()) { + return null; + } + return ""; + } + + /** + * 请求参数 + * + * @param queryParams + * @return + */ + private String getQueryParams(Map queryParams) { + StringBuilder urlParams = new StringBuilder(); + for (Map.Entry kv : queryParams.entrySet()) { + if (urlParams.length() > 0) { + urlParams.append("&"); + } + urlParams.append(kv.getKey()).append("=").append(kv.getValue()); + } + return urlParams.toString(); + } + + /** + * 刷新 + */ + private void refreshOAuth2ContextAccessToken() { + if (oAuth2ClientContext.getAccessToken().getExpiresIn() < 1800) { + LOG.debug("accessToken时间小于1800s,刷新token"); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + MultiValueMap queryParams = new LinkedMultiValueMap<>(); + queryParams.add("grant_type", "refresh_token"); + queryParams.add("refresh_token", oAuth2ClientContext.getAccessToken().getRefreshToken().getValue()); + queryParams.add("client_id", oauthClientProperties.getClientId()); + queryParams.add("client_secret", oauthClientProperties.getClientSecret()); + HttpEntity> httpEntity = new HttpEntity<>(queryParams, httpHeaders); + RestTemplate restTemplate = getRestTemplate(); + try { + String result = getResponse(restTemplate.postForEntity(oauthClientProperties.getAccessTokenUri(), httpEntity, String.class)); + if (!StringUtils.isBlank(result)) { + Map tokenMap = JSON.parseObject(result, Map.class); + oAuth2ClientContext.setAccessToken(DefaultOAuth2AccessToken.valueOf(tokenMap)); + } + } catch (Exception e) { + LOG.error(e.getMessage(), e); + } + } + } + + /** + * 获取accessToken + * + * @return + */ + private String getOAuth2ContextAccessToken() { + return oAuth2ClientContext.getAccessToken().getValue(); + } + +} \ No newline at end of file diff --git a/cloud-common/src/main/java/com/cm/common/pojo/vos/push/PushMessageVO.java b/cloud-common/src/main/java/com/cm/common/pojo/vos/push/PushMessageVO.java new file mode 100644 index 0000000..91d5d95 --- /dev/null +++ b/cloud-common/src/main/java/com/cm/common/pojo/vos/push/PushMessageVO.java @@ -0,0 +1,50 @@ +package com.cm.common.pojo.vos.push; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * When you feel like quitting. Think about why you started + * 当你想要放弃的时候,想想当初你为何开始 + * + * @ClassName: PushMessageDTO + * @Description: 推送消息 + * @Author: WangGeng + * @Date: 2019/10/13 7:32 下午 + * @Version: 1.0 + **/ +@ApiModel +public class PushMessageVO { + + @ApiModelProperty(name = "title", value = "标题") + private String title; + @ApiModelProperty(name = "content", value = "内容") + private String content; + + public String getTitle() { + return title == null ? "" : title.trim(); + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content == null ? "" : content.trim(); + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("{"); + sb.append("\"title\":") + .append("\"").append(title).append("\""); + sb.append(",\"content\":") + .append("\"").append(content).append("\""); + sb.append('}'); + return sb.toString(); + } +} diff --git a/cloud-common/src/main/java/com/cm/common/token/app/entity/AppTokenUser.java b/cloud-common/src/main/java/com/cm/common/token/app/entity/AppTokenUser.java index f60168a..c05ef2d 100644 --- a/cloud-common/src/main/java/com/cm/common/token/app/entity/AppTokenUser.java +++ b/cloud-common/src/main/java/com/cm/common/token/app/entity/AppTokenUser.java @@ -20,9 +20,9 @@ public class AppTokenUser { private String username; private String phone; private String email; - private List appTokenUserRoles; - private List appTokenUserPositions; - private List appTokenUserDepartments; + private List roles; + private List positions; + private List departments; public String getId() { return id == null ? "" : id.trim(); @@ -72,28 +72,28 @@ public class AppTokenUser { this.email = email; } - public List getAppTokenUserRoles() { - return appTokenUserRoles; + public List getRoles() { + return roles; } - public void setAppTokenUserRoles(List appTokenUserRoles) { - this.appTokenUserRoles = appTokenUserRoles; + public void setRoles(List roles) { + this.roles = roles; } - public List getAppTokenUserPositions() { - return appTokenUserPositions; + public List getPositions() { + return positions; } - public void setAppTokenUserPositions(List appTokenUserPositions) { - this.appTokenUserPositions = appTokenUserPositions; + public void setPositions(List positions) { + this.positions = positions; } - public List getAppTokenUserDepartments() { - return appTokenUserDepartments; + public List getDepartments() { + return departments; } - public void setAppTokenUserDepartments(List appTokenUserDepartments) { - this.appTokenUserDepartments = appTokenUserDepartments; + public void setDepartments(List departments) { + this.departments = departments; } @Override @@ -111,12 +111,12 @@ public class AppTokenUser { .append("\"").append(phone).append("\""); sb.append(",\"email\":") .append("\"").append(email).append("\""); - sb.append(",\"appTokenUserRoles\":") - .append(appTokenUserRoles); - sb.append(",\"appTokenUserPositions\":") - .append(appTokenUserPositions); - sb.append(",\"appTokenUserDepartments\":") - .append(appTokenUserDepartments); + sb.append(",\"roles\":") + .append(roles); + sb.append(",\"positions\":") + .append(positions); + sb.append(",\"departments\":") + .append(departments); sb.append('}'); return sb.toString(); } diff --git a/cloud-security/pom.xml b/cloud-security/pom.xml index a92a02c..10927ec 100644 --- a/cloud-security/pom.xml +++ b/cloud-security/pom.xml @@ -5,12 +5,12 @@ cm-cloud com.cm - 1.0.0.RELEASE + 1.0.1-SNAPSHOT 4.0.0 cloud-security - 1.0.0.RELEASE + 1.0.1-SNAPSHOT diff --git a/cloud-token-in/pom.xml b/cloud-token-in/pom.xml index d5f8a32..94cc529 100644 --- a/cloud-token-in/pom.xml +++ b/cloud-token-in/pom.xml @@ -5,13 +5,13 @@ cm-cloud com.cm - 1.0.0.RELEASE + 1.0.1-SNAPSHOT 接收系统校验 4.0.0 cloud-token-in - 1.0.0.RELEASE + 1.0.1-SNAPSHOT diff --git a/cloud-token-out/pom.xml b/cloud-token-out/pom.xml index 10ab231..3e8ec64 100644 --- a/cloud-token-out/pom.xml +++ b/cloud-token-out/pom.xml @@ -5,13 +5,13 @@ cm-cloud com.cm - 1.0.0.RELEASE + 1.0.1-SNAPSHOT 发送系统校验 4.0.0 cloud-token-out - 1.0.0.RELEASE + 1.0.1-SNAPSHOT diff --git a/pom.xml b/pom.xml index 12b7041..e41c051 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.cm cm-cloud - 1.0.0.RELEASE + 1.0.1-SNAPSHOT cloud-common cloud-security