Browse Source

功能:实现dmp-auth的集团,项目验证功能,对应的ems-saas-web版本为v2.0.0分支,版本号为c218047b0972f462b2cfeff048e0af7b288b1ac9

lijie 3 years ago
parent
commit
ead1a1bbf1

+ 7 - 0
dmp-common/src/main/java/com/persagy/dmp/common/constant/CommonConstant.java

@@ -16,6 +16,13 @@ public interface CommonConstant {
     /** 项目id */
     String QUERY_PROJECTID = "projectId";
 
+    /** 项目ids */
+    String QUERY_PROJECTIDS = "projectIds";
+    /** success */
+    String QUERY_SUCCESS = "success";
+    /** failure */
+    String QUERY_FAILURE = "failure";
+
     /** 用户id */
     String QUERY_USERID = "accountId";
 

+ 4 - 0
dmp-comp/dmp-auth/pom.xml

@@ -19,6 +19,10 @@
             <groupId>com.persagy</groupId>
             <artifactId>integrated-log-spring-boot-starter</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
     </dependencies>
     
 </project>

+ 38 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/client/EmsSaasWebClient.java

@@ -0,0 +1,38 @@
+package com.persagy.dmp.auth.client;
+
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.dmp.auth.domain.Group;
+import com.persagy.dmp.auth.domain.ResultReturn;
+import feign.Headers;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+/**
+ * 运维系统
+ * <p> PersagyManageClient.java.</p>
+ * <p>Description:  .</p>
+ * <p>Company: .</p>
+ * <p>@author gezhanbin</p>
+ * <p>@version .</p>
+ * 2019年6月17日: 下午2:21:44
+ */
+@FeignClient(name = "EMS-SAAS-WEB",fallbackFactory = EmsSaasWebFallbackFactory.class)
+public interface EmsSaasWebClient {
+
+	/***
+	 * Description: 查询集团项目列表
+	 * @param param : 请求参数
+	 * @return : java.util.List<com.alibaba.fastjson.JSONObject>
+	 * @author : lijie
+	 * @date :2021/11/8 14:12
+	 * Update By lijie 2021/11/8 14:12
+	 */
+	@PostMapping(value = "/rwd/groupAndSchema/admin/queryGroupProjectList")
+	ResultReturn<Group> queryGroupProjectList(@RequestBody JSONObject param);
+	
+}

+ 25 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/client/EmsSaasWebFallbackFactory.java

@@ -0,0 +1,25 @@
+package com.persagy.dmp.auth.client;
+
+import com.persagy.dmp.auth.domain.Group;
+import com.persagy.dmp.auth.domain.ResultReturn;
+import com.persagy.dmp.common.constant.CommonConstant;
+import feign.hystrix.FallbackFactory;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class EmsSaasWebFallbackFactory implements FallbackFactory<EmsSaasWebClient> {
+
+    /**
+     * 调用失败,返回
+     */
+    @Override
+    public EmsSaasWebClient create(Throwable throwable) {
+        return param -> {
+            ResultReturn<Group> resultReturn = new ResultReturn<>();
+            resultReturn.setResult(CommonConstant.QUERY_FAILURE);
+            resultReturn.setResultMsg("请求运维系统失败:"+throwable.getMessage());
+            return resultReturn;
+        };
+    }
+
+}

+ 30 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/config/CommonWebConfigurer.java

@@ -1,6 +1,12 @@
 package com.persagy.dmp.auth.config;
 
+import com.persagy.dmp.auth.client.EmsSaasWebFallbackFactory;
 import com.persagy.dmp.auth.handler.AppContextHandler;
+import com.persagy.dmp.auth.service.AuthService;
+import com.persagy.dmp.auth.service.impl.BossAuthServiceImpl;
+import com.persagy.dmp.auth.service.impl.EmsAuthServiceImpl;
+import com.persagy.dmp.auth.service.impl.NoneAuthServiceImpl;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.core.annotation.Order;
@@ -29,4 +35,28 @@ public class CommonWebConfigurer implements WebMvcConfigurer {
         registry.addInterceptor(appContextHandler()).order(10).addPathPatterns(includePaths).excludePathPatterns(excludePaths);
     }
 
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "1")
+    public EmsSaasWebFallbackFactory emsSaasWebFallbackFactory(){
+        return new EmsSaasWebFallbackFactory();
+    }
+
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "1")
+    public AuthService emsAuthServiceImpl(){
+        return new EmsAuthServiceImpl();
+    }
+
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "-1",matchIfMissing = true)
+    public AuthService noneAuthServiceImpl(){
+        return new NoneAuthServiceImpl();
+    }
+
+    @Bean
+    @ConditionalOnProperty(value = "persagy.common.auth.channel", havingValue = "2")
+    public AuthService bossAuthServiceImpl(){
+        return new BossAuthServiceImpl();
+    }
+
 }

+ 18 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/domain/Group.java

@@ -0,0 +1,18 @@
+package com.persagy.dmp.auth.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+@Data
+@ToString
+@EqualsAndHashCode
+public class Group {
+
+    private String groupCode;
+    private String groupName;
+    private List<Project> projects;
+
+}

+ 13 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/domain/Project.java

@@ -0,0 +1,13 @@
+package com.persagy.dmp.auth.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Data
+@ToString
+@EqualsAndHashCode
+public class Project {
+    private String projectId;
+    private String projectName;
+}

+ 46 - 0
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/domain/ResultReturn.java

@@ -0,0 +1,46 @@
+package com.persagy.dmp.auth.domain;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.util.List;
+
+@Data
+@ToString
+@EqualsAndHashCode
+public class ResultReturn<T> {
+
+	/**返回状态:success,failure*/
+	@JSONField(name = "Result")
+	@JsonProperty("Result")
+	private String result;
+
+	/**返回一个对象时使用*/
+	@JSONField(name = "Item")
+	@JsonProperty("Item")
+	private T item;
+
+	/**返回集合时使用*/
+	@JSONField(name = "Content")
+	@JsonProperty("Content")
+	private List<T> content;
+
+	/**返回状态的具体信息*/
+	@JSONField(name = "ResultMsg")
+	@JsonProperty("ResultMsg")
+	private String resultMsg;
+
+	/**返回状态码*/
+	@JSONField(name = "ResultCode")
+	@JsonProperty("ResultCode")
+	private Integer resultCode;
+
+	/**返回集合的长度*/
+	@JSONField(name = "Count")
+	@JsonProperty("Count")
+	private Integer count;
+
+}

+ 78 - 1
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/EmsAuthServiceImpl.java

@@ -1,7 +1,27 @@
 package com.persagy.dmp.auth.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.dmp.auth.client.EmsSaasWebClient;
+import com.persagy.dmp.auth.domain.Group;
+import com.persagy.dmp.auth.domain.Project;
+import com.persagy.dmp.auth.domain.ResultReturn;
+import com.persagy.dmp.common.constant.CommonConstant;
+import com.persagy.dmp.common.constant.ResponseCode;
+import com.persagy.dmp.common.context.AppContext;
+import com.persagy.dmp.common.exception.BusinessException;
+import lombok.RequiredArgsConstructor;
+import lombok.SneakyThrows;
+import org.springframework.beans.factory.annotation.Autowired;
+
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 运维平台2.0 鉴权实现类
@@ -10,11 +30,68 @@ import javax.servlet.http.HttpServletResponse;
  * @date 2021-11-02
  */
 public class EmsAuthServiceImpl extends AbstractAuthServiceImpl {
+    @Autowired
+    private EmsSaasWebClient emsSaasWebClient;
 
     @Override
     public void loginSuccess(HttpServletRequest request, HttpServletResponse response) {
         super.loginSuccess(request, response);
         loadContextByRequest(request);
-        // TODO 验证集团是否有效、验证项目是否匹配集团、没有集团编码时根据项目匹配集团
+        if (StrUtil.isBlank(AppContext.getContext().getGroupCode())
+                && StrUtil.isBlank(AppContext.getContext().getProjectId())){
+            // 两者都为空时不做校验,例如def/class的接口,dic的接口
+            return;
+        }
+        JSONObject param = new JSONObject();
+        if (StrUtil.isNotBlank(AppContext.getContext().getGroupCode())){
+            param.put(CommonConstant.QUERY_GROUPCODE,AppContext.getContext().getGroupCode());
+        }
+        if (StrUtil.isNotBlank(AppContext.getContext().getProjectId())){
+            param.put(CommonConstant.QUERY_PROJECTIDS, CollUtil.newArrayList(AppContext.getContext().getProjectId()));
+        }
+        ResultReturn<Group> queryResult = emsSaasWebClient.queryGroupProjectList(param);
+        if (!CommonConstant.QUERY_SUCCESS.equals(queryResult.getResult())){
+            throw new BusinessException(queryResult.getResultMsg());
+        }
+        List<Group> content = queryResult.getContent();
+        if (CollUtil.isEmpty(content)){
+            throw new BusinessException(ResponseCode.A0402.getCode(),ResponseCode.A0402.getDesc());
+        }
+        Map<String, List<Project>> groupMap = content.stream()
+                .collect(Collectors.toMap(Group::getGroupCode, Group::getProjects, (k1, k2) -> k1));
+        // 1.没有集团编码时根据项目匹配集团
+        if (StrUtil.isBlank(AppContext.getContext().getGroupCode())){
+            // 如果集团编码为空则通过项目id查找
+            Set<Map.Entry<String, List<Project>>> entries = groupMap.entrySet();
+            flag:
+            for (Map.Entry<String, List<Project>> entry : entries) {
+                if (CollUtil.isEmpty(entry.getValue())){
+                    continue;
+                }
+                for (Project project : entry.getValue()) {
+                    if (AppContext.getContext().getProjectId().equals(project.getProjectId())){
+                        AppContext.getContext().setGroupCode(entry.getKey());
+                        break flag;
+                    }
+                }
+            }
+        }
+        // 2.验证集团是否有效
+        if (StrUtil.isBlank(AppContext.getContext().getGroupCode())
+                || !groupMap.containsKey(AppContext.getContext().getGroupCode())){
+            throw new BusinessException(ResponseCode.A0402.getCode(),ResponseCode.A0402.getDesc());
+        }
+        // 3.验证项目是否匹配集团
+        if (StrUtil.isBlank(AppContext.getContext().getProjectId())){
+            return;
+        }
+        List<Project> projects = groupMap
+                .getOrDefault(AppContext.getContext().getGroupCode(), new ArrayList<>());
+        if (!projects.stream()
+                .map(Project::getProjectId)
+                .collect(Collectors.toSet())
+                .contains(AppContext.getContext().getProjectId())){
+            throw new BusinessException(ResponseCode.A0402.getCode(),ResponseCode.A0402.getDesc());
+        }
     }
 }

+ 0 - 3
dmp-comp/dmp-auth/src/main/java/com/persagy/dmp/auth/service/impl/NoneAuthServiceImpl.java

@@ -1,7 +1,5 @@
 package com.persagy.dmp.auth.service.impl;
 
-import org.springframework.stereotype.Service;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
@@ -11,7 +9,6 @@ import javax.servlet.http.HttpServletResponse;
  * @author Charlie Yu
  * @date 2021-11-02
  */
-@Service
 public class NoneAuthServiceImpl extends AbstractAuthServiceImpl{
 
     @Override