From fd0a070abce625fcd2885a6f4b613fe9b4fa92fa Mon Sep 17 00:00:00 2001 From: huangweixiong Date: Mon, 9 May 2022 15:30:52 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E8=83=BD=E5=8A=9B=E4=B8=8A=E6=9E=B6?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E3=80=91=E6=B7=BB=E5=8A=A0api=E7=BD=91?= =?UTF-8?q?=E5=85=B3=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interceptor/YaweiSSOProperties.java | 2 +- .../entity/TAbilityApplicationEntity.java | 5 + .../listener/CorrectionListener.java | 38 ++++++++ .../service/ApiGatewayService.java | 96 ++++++++++++++++--- .../listener/ResourceOwnerListener.java | 10 +- .../src/main/resources/application-prod.yml | 6 +- .../src/main/resources/yaweisso.properties | 4 +- .../java/io/renren/ApiGatewayServiceTest.java | 11 ++- 8 files changed, 150 insertions(+), 22 deletions(-) diff --git a/renren-admin/src/main/java/io/renren/common/interceptor/YaweiSSOProperties.java b/renren-admin/src/main/java/io/renren/common/interceptor/YaweiSSOProperties.java index 5a7b4f17..d50e7542 100644 --- a/renren-admin/src/main/java/io/renren/common/interceptor/YaweiSSOProperties.java +++ b/renren-admin/src/main/java/io/renren/common/interceptor/YaweiSSOProperties.java @@ -7,7 +7,7 @@ import org.springframework.stereotype.Component; @Data @Component -@PropertySource("classpath:/yaweisso.properties") +@PropertySource("classpath:yaweisso.properties") @ConfigurationProperties(prefix = "sso") public class YaweiSSOProperties { private String domain; diff --git a/renren-admin/src/main/java/io/renren/modules/processForm/entity/TAbilityApplicationEntity.java b/renren-admin/src/main/java/io/renren/modules/processForm/entity/TAbilityApplicationEntity.java index 10bcaa8b..9a597057 100644 --- a/renren-admin/src/main/java/io/renren/modules/processForm/entity/TAbilityApplicationEntity.java +++ b/renren-admin/src/main/java/io/renren/modules/processForm/entity/TAbilityApplicationEntity.java @@ -66,4 +66,9 @@ public class TAbilityApplicationEntity { * 用户id */ private String userId; + + /** + * 流程通过后api网关注册的认证code,用于三方接口调用 + */ + private String gatewayCode; } \ No newline at end of file diff --git a/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java b/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java index ef2b3809..0c608559 100644 --- a/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java +++ b/renren-admin/src/main/java/io/renren/modules/processForm/listener/CorrectionListener.java @@ -1,9 +1,12 @@ package io.renren.modules.processForm.listener; +import cn.hutool.core.lang.UUID; import com.google.gson.Gson; import com.google.gson.JsonElement; import io.renren.modules.processForm.dto.TAbilityApplicationDTO; +import io.renren.modules.processForm.service.ApiGatewayService; import io.renren.modules.resource.dto.ResourceDTO; +import io.renren.modules.resource.entity.ResourceEntity; import io.renren.modules.resource.service.ResourceService; import io.renren.modules.sys.dto.SysDeptDTO; import io.renren.modules.sys.dto.SysRoleDTO; @@ -12,6 +15,8 @@ import io.renren.modules.sys.service.SysDeptService; import io.renren.modules.sys.service.SysRoleService; import io.renren.modules.sys.service.SysRoleUserService; import io.renren.modules.sys.service.SysUserService; +import org.activiti.engine.ProcessEngine; +import org.activiti.engine.ProcessEngines; import org.activiti.engine.TaskService; import org.activiti.engine.delegate.*; import org.activiti.engine.delegate.event.ActivitiEvent; @@ -47,6 +52,9 @@ public class CorrectionListener implements TaskListener, ExecutionListener, Acti @Autowired private SysDeptService sysDeptService; + @Autowired + private ApiGatewayService apiGatewayService; + @Autowired private ResourceService resourceService; @@ -58,6 +66,9 @@ public class CorrectionListener implements TaskListener, ExecutionListener, Acti case EVENTNAME_CREATE: create(delegateTask); break; + case EVENTNAME_COMPLETE: + complete(delegateTask); + break; default: } logger.error("-------------------------结束部门动态审批人流程-------------------------------"); @@ -138,4 +149,31 @@ public class CorrectionListener implements TaskListener, ExecutionListener, Acti taskService.setAssignee(delegateTask.getId(), "1516728698224427010"); } } + + /** + * 审批通过,申请code + * @param delegateTask + */ + private void complete(DelegateTask delegateTask) { + Map kv = delegateTask.getVariables(); + Gson gson = new Gson(); + JsonElement jsonElement = gson.toJsonTree(kv); + TAbilityApplicationDTO abilityApplicationDTO = gson.fromJson(jsonElement, TAbilityApplicationDTO.class); + + ResourceEntity resourceEntity = resourceService.selectById(abilityApplicationDTO.getResourceId()); + + //没有groupid当做没有接口,直接跳过 + if (resourceEntity.getGroupId() == null) + return; + + String code = UUID.randomUUID().toString(); + apiGatewayService.subscribeCode(String.valueOf(abilityApplicationDTO.getId()), code); + + delegateTask.setVariable("gatewayCode", code); + + String apiPrefix = "/juapi/" + abilityApplicationDTO.getResourceId(); + TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService(); + String msg = String.format("您的能力申请已通过,接口认证code为:%s, 接口公共前缀为:%s",code, apiPrefix) ; + taskService.addComment(delegateTask.getId(), delegateTask.getProcessInstanceId(), msg); + } } diff --git a/renren-admin/src/main/java/io/renren/modules/processForm/service/ApiGatewayService.java b/renren-admin/src/main/java/io/renren/modules/processForm/service/ApiGatewayService.java index 156012ee..521e3181 100644 --- a/renren-admin/src/main/java/io/renren/modules/processForm/service/ApiGatewayService.java +++ b/renren-admin/src/main/java/io/renren/modules/processForm/service/ApiGatewayService.java @@ -1,9 +1,14 @@ package io.renren.modules.processForm.service; +import cn.hutool.core.lang.UUID; import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import io.renren.modules.processForm.dao.TAbilityApplicationDao; +import io.renren.modules.processForm.entity.TAbilityApplicationEntity; import io.renren.modules.resource.dao.ResourceDao; import io.renren.modules.resource.entity.ResourceEntity; import lombok.extern.slf4j.Slf4j; @@ -21,40 +26,60 @@ import java.util.regex.Pattern; @Service @Slf4j +/** + * 聚好看网关对接相关 + * + */ public class ApiGatewayService { @Autowired private ResourceDao resourceDao; + @Autowired + private TAbilityApplicationDao abilityApplicationDao; + @Autowired private RestTemplate restTemplate; - @Value("${hisense.gateway.url:http://devtest-security-app.hismarttv.com:8080}") + @Value("${hisense.gateway.url}") private String gatewayUrl; - /** + /** 将api注册到网关 + * 注册流程:创建group -> 创建路由(api)并关联到group下,未来可多个api关联 * @param resourceId 能力资源的id * @return */ public void registerApi2Gateway(String resourceId){ if (resourceId == null) { - log.warn("传入resourceId为空"); - return; + throw new IllegalArgumentException("传入resourceId为空"); } ResourceEntity resourceEntity = resourceDao.selectById(resourceId); + if (resourceEntity == null) { + throw new IllegalArgumentException(String.format("未找到对应的资源id:%s", resourceId)); + } String apiUrl = resourceEntity.getApiUrl(); + String methods = resourceEntity.getApiMethodType().toUpperCase(); - if (apiUrl == null || !apiUrl.startsWith("http")){ - log.warn("非法apiurl!! apiUrl:{} resourceId:{}",apiUrl, resourceId); + if (StringUtils.isBlank(apiUrl) || StringUtils.isBlank(methods)){ + String msg = String.format("注册api参数为空,跳过 apiUrl:%s, methods:%s, resourceId:%s", apiUrl, methods, resourceId); + //重要参数没有当成不需要注册 + log.info(msg); return; } //建group String domain = getIP(apiUrl); + String uris = apiUrl.substring(apiUrl.indexOf(domain) + domain.length()); + if (StringUtils.isBlank(uris)) { + uris = "/"; + } + String apiPrefix = "/juapi/" + resourceId; HashMap groupEntity = new HashMap(); + groupEntity.put("id", resourceId); groupEntity.put("name", resourceEntity.getName()); + groupEntity.put("stripPrefixPattern",String.format("^%s/(.*)", apiPrefix)); groupEntity.put("serviceName",domain ); String groupUrl = gatewayUrl + "/apiops/api/groups"; @@ -63,17 +88,17 @@ public class ApiGatewayService { HashMap body = responseEntity.getBody(); String id = (String) body.get("id"); if (StringUtils.isBlank(id)){ - log.error("创建group时id为空 {} body:{}", JSON.toJSONString(groupEntity), body); - return; + String error = String.format("创建group时id为空 request:%s body:%s", JSON.toJSONString(groupEntity), body); + throw new RuntimeException(error); } //建路由(接口url) - String routeUrl = gatewayUrl + "apiops/api/routers"; + String routeUrl = gatewayUrl + "/apiops/api/routers"; HashMap routeEntity = new HashMap(); routeEntity.put("name", "api:1:" + resourceEntity.getName()); routeEntity.put("group", id); - routeEntity.put("methods", resourceEntity.getApiMethodType().toUpperCase()); - routeEntity.put("uris", apiUrl.substring(apiUrl.indexOf(domain) + domain.length())); + routeEntity.put("methods", methods); + routeEntity.put("uris", apiPrefix + uris); ResponseEntity routeResEntity = restTemplate.postForEntity(routeUrl, routeEntity, HashMap.class); if (routeResEntity.getStatusCode() != HttpStatus.OK || !responseEntity.hasBody()){ //失败则删除group @@ -89,6 +114,55 @@ public class ApiGatewayService { } } + /** + * 将code关联到group,api这希望code由我们来生成 + * 关联流程:创建消费者 -> 订阅接口传入code关联消费者与group + * @param formId + * @param code + */ + public void subscribeCode( String formId, String code){ + + if ( StringUtils.isBlank(formId) || StringUtils.isBlank(code)) { + throw new IllegalArgumentException(String.format("关键参数不能为空 formId:%s code:%s", formId, code)); + } + + TAbilityApplicationEntity applicationEntity = abilityApplicationDao.selectById(formId); + ResourceEntity resourceEntity = resourceDao.selectById(applicationEntity.getResourceId()); + String groupId = resourceEntity.getGroupId(); + if (resourceEntity == null){ + throw new RuntimeException(String.format("找不到资源类 groupId:%s", groupId)); + } + + //注册消费者,一个表单关联一个消费者 + HashMap consumerEntity = new HashMap(); + consumerEntity.put("id", formId); + consumerEntity.put("name", resourceEntity.getName() + "-concumer"); + + String consumerUrl = gatewayUrl + "/apiops/api/consumers"; + HashMap consumerResponse = restTemplate.postForEntity(consumerUrl, consumerEntity, HashMap.class).getBody(); + if (consumerResponse == null || !formId.equals(consumerResponse.get("id"))){ + throw new RuntimeException(String.format("消费者创建失败 response: %s", consumerResponse)); + } + + //订阅 + HashMap subscribeEntity = new HashMap(); + subscribeEntity.put("consumerId", formId); + subscribeEntity.put("routerId", groupId); + subscribeEntity.put("routerType","group"); + subscribeEntity.put("code", code); + + String subscribeUrl = gatewayUrl + "/apiops/api/subscribers"; + HashMap body = restTemplate.postForEntity(subscribeUrl, subscribeEntity, HashMap.class).getBody(); + if (body == null || StringUtils.isBlank((String) body.get("consumerId"))){ + throw new RuntimeException(String.format("订阅失败 response: %s", body)); + } + + LambdaUpdateWrapper updateWrapper = new UpdateWrapper().lambda() + .eq(TAbilityApplicationEntity::getId, formId) + .set(TAbilityApplicationEntity::getGatewayCode, code); + abilityApplicationDao.update(null, updateWrapper); + } + private String getIP(String url) { String re = "((http|ftp|https)://)(([a-zA-Z0-9._-]+)|([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))(([a-zA-Z]{2,6})|(:[0-9]{1,4})?)"; String str = ""; diff --git a/renren-admin/src/main/java/io/renren/modules/resourceMountApply/listener/ResourceOwnerListener.java b/renren-admin/src/main/java/io/renren/modules/resourceMountApply/listener/ResourceOwnerListener.java index b5088653..a6f907c5 100644 --- a/renren-admin/src/main/java/io/renren/modules/resourceMountApply/listener/ResourceOwnerListener.java +++ b/renren-admin/src/main/java/io/renren/modules/resourceMountApply/listener/ResourceOwnerListener.java @@ -79,9 +79,9 @@ public class ResourceOwnerListener implements TaskListener, ExecutionListener, A case EVENTNAME_CREATE: // 创建当前审批节点事件 create(delegateTask, roleDTO); break; -// case EVENTNAME_COMPLETE: -// complete(delegateTask); -// break; + case EVENTNAME_COMPLETE: + complete(delegateTask); + break; default: logger.error("未处理该事件:" + eventName); } @@ -124,7 +124,7 @@ public class ResourceOwnerListener implements TaskListener, ExecutionListener, A } /** - * 流程结束,推送 + * 流程结束,接口推送api * * @param delegateTask */ @@ -134,7 +134,7 @@ public class ResourceOwnerListener implements TaskListener, ExecutionListener, A JsonElement jsonElement = gson.toJsonTree(kv); TResourceMountApplyDTO resourceMountApplyDTO = gson.fromJson(jsonElement, TResourceMountApplyDTO.class); Long resourceID = resourceMountApplyDTO.getResourceDTO().getId(); -// apiGatewayService.registerApi2Gateway(String.valueOf(resourceID)); + apiGatewayService.registerApi2Gateway(String.valueOf(resourceID)); ResourceDTO re = resourceMountApplyDTO.getResourceDTO(); if (re != null) { diff --git a/renren-admin/src/main/resources/application-prod.yml b/renren-admin/src/main/resources/application-prod.yml index f85e42f5..bbf13ad6 100644 --- a/renren-admin/src/main/resources/application-prod.yml +++ b/renren-admin/src/main/resources/application-prod.yml @@ -42,4 +42,8 @@ resource: # 大数据部门相关配置 big_date: name: 青岛市大数据发展管理局 - assignee_role_name: 部门审批人 \ No newline at end of file + assignee_role_name: 部门审批人 + +hisense: + gateway: + url: http://devtest-security-app.hismarttv.com:8080 \ No newline at end of file diff --git a/renren-admin/src/main/resources/yaweisso.properties b/renren-admin/src/main/resources/yaweisso.properties index bb802a06..9d5bcaeb 100644 --- a/renren-admin/src/main/resources/yaweisso.properties +++ b/renren-admin/src/main/resources/yaweisso.properties @@ -1,3 +1,3 @@ -sso.domain=yw.com.cn +sso.domain=127.0.0.1:8080 sso.ssoKey=SSOToken -sso.keeperUrl=http://127.0.0.1:9090/renren-admin/sys/user/123 \ No newline at end of file +sso.keeperUrl=http://jhoa.qd.gov.cn \ No newline at end of file diff --git a/renren-admin/src/test/java/io/renren/ApiGatewayServiceTest.java b/renren-admin/src/test/java/io/renren/ApiGatewayServiceTest.java index 71134cab..a783dd71 100644 --- a/renren-admin/src/test/java/io/renren/ApiGatewayServiceTest.java +++ b/renren-admin/src/test/java/io/renren/ApiGatewayServiceTest.java @@ -1,5 +1,6 @@ package io.renren; +import cn.hutool.core.lang.UUID; import io.renren.common.redis.RedisUtils; import io.renren.modules.processForm.service.ApiGatewayService; import io.renren.modules.sys.entity.SysUserEntity; @@ -17,8 +18,14 @@ public class ApiGatewayServiceTest { private ApiGatewayService apiGatewayService; @Test - public void contextLoads() { - apiGatewayService.registerApi2Gateway("1519505145602723841"); + public void registerApi2Gateway() { + apiGatewayService.registerApi2Gateway("1522550194523152385"); + } + + @Test + public void registerCode2Group() { + String code = UUID.randomUUID().toString(); + apiGatewayService.subscribeCode("1522550733273112577", code); } } \ No newline at end of file