Sfoglia il codice sorgente

实现根据门户token生成临时token

欧阳劲驰 1 settimana fa
parent
commit
3c501ecb49
23 ha cambiato i file con 488 aggiunte e 75 eliminazioni
  1. 5 2
      custom-gateway-app/src/main/resources/application-zydma.yml
  2. 1 4
      custom-gateway-app/src/main/resources/application.yml
  3. 22 26
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/constants/Api.java
  4. 39 7
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/ResultResponse.java
  5. 25 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/exception/SelfException.java
  6. 90 0
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/AesUtil.java
  7. 25 9
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/CallingUtil.java
  8. 1 1
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/RequestUtil.java
  9. 20 2
      custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/TokenUtil.java
  10. 1 1
      custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/components/DataCollector.java
  11. 1 1
      custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/components/InfoSynchronizer.java
  12. 1 1
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/DataCollector.java
  13. 29 19
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/InfoSynchronizer.java
  14. 14 2
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/MiddlePlatformMetadata.java
  15. 16 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/controller/ApiController.java
  16. 139 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/controller/UserController.java
  17. 3 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformUser.java
  18. 8 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/mapper/primary/PersonnelInfoMapper.java
  19. 8 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/PersonnelInfoService.java
  20. 13 0
      custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/impl/PersonnelInfoServiceImpl.java
  21. 23 0
      custom-gateway-zydma/src/main/resources/mapper/PersonnelInfoMapper.xml
  22. BIN
      libs/gbase.1.0.5.jar
  23. 4 0
      pom.xml

+ 5 - 2
custom-gateway-app/src/main/resources/application-zydma.yml

@@ -3,10 +3,13 @@ calling:
   #对接点
   endpoints:
     zaoyang-middle:
-      url: http://223.75.194.87:8200/PandaCore/GCK
+      url: http://223.75.194.87:8200
       access-key: lousunkongzhi
       secret-key: g+4UWJ6360SxDVu+9BRRQfOg0/tT+33o3S8Q5APMLIn+JQirprtdGd0cf5Y3WO7iiKo24T5mN1U697zHp/iGNA==
     zaoyang-iot:
       url: http://223.75.194.87:8200/pdserver
       access-key: Data
-      secret-key: panda666.
+      secret-key: panda666.
+security:
+  permit-pattern:
+    - ${gateway.routes.zydma}/users/ticket-exchange

+ 1 - 4
custom-gateway-app/src/main/resources/application.yml

@@ -6,7 +6,7 @@ server:
 #网关
 gateway:
   routes:
-    zydma: /zy-dma/
+    zydma: /zy-dma
 #spring
 spring:
   application:
@@ -55,9 +55,6 @@ mybatis:
 security:
   expiration: P7D
   secret: TRICP_ALAM_DMA
-  permit-pattern:
-    - /common/async-results
-    - /common/temp-files
 #对接
 calling:
   connect-timeout: PT30S

+ 22 - 26
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/constants/Api.java

@@ -7,7 +7,7 @@ package com.shkpr.service.customgateway.core.constants;
  * @since 1.0.0
  */
 public interface Api {
-    String EXCEPTION_FORMAT = "{%s:%s}:%s"; //{(ios/apk/pc):url}:error reason
+
     String WORKSPACE = "Workspace";
     String URI_XXX_NEW_INFO = "new-info";//新增
     String URI_XXX_LISTS = "lists"; //分页查询
@@ -44,13 +44,12 @@ public interface Api {
     String URI_ACCESS_TOKEN_CHECK = "/kpr-plugin/apply/access-token-check";
     String URI_FILE_BUSI_XXX = "/files/**";
     String URI_IMAGE_SHOW_XXX = "/imageShow/**";
+
     String URI_ALL_BUSI_XXX = "/kpr-plugin/**";
     String URI_GIS_SURVEY_H = "/kpr-plugin/gis-survey";
     String URI_GIS_SURVEY_XXX = URI_GIS_SURVEY_H + "/**";
     String URI_PIPE_BURST_H = "/kpr-plugin/pipe_burst";
     String URI_PIPE_BURST_XXX = URI_PIPE_BURST_H + "/**";
-    String URI_USERS_H = "/kpr-plugin/users";
-    String URI_USERS_XXX = URI_USERS_H + "/**";
     String URI_COMMON_H = "/kpr-plugin/common";
     String URI_COMMON_XXX = URI_COMMON_H + "/**";
     String URI_FILES_H = "/kpr-plugin/files";
@@ -58,29 +57,26 @@ public interface Api {
     String URI_INTERNAL_H = "/kpr-plugin/internal";
     String URI_INTERNAL_XXX = URI_INTERNAL_H + "/**";
     String URI_INTERNAL_OPS_XXX = "/ops/**";
-    /**
-     * 请求头
-     */
-    interface Headers {
-        //验证口令
-        String AUTH_VERIFY = "Auth-Verify";
-        //ip地址
-        String X_SOURCE_IP = "X-Source-IP";
-        String BIZ_TYPE = "Biz-Type";
-        String CLIENT_TYPE = "Client-Type";
-        String USER_AGENT = "user-agent";
-        String SIGN_KEY = "tri_coorperation_tech_task";
-        String TIMESTAMP = "Timestamp";
-        String SEQUENCE = "Sequence";
-        String SIGNATURE = "Signature";
-        //认证
-        String AUTHORIZATION = "Authorization";
-    }
 
-    /**
-     * 请求属性
-     */
-    interface Attributes {
+    String URI_XXX_TICKET_EXCHANGE = "ticket-exchange";
+
+    String URI_USERS_H = "/users";
+
+    //==========================请求头==========================
+    //验证口令
+    String HEADER_AUTH_VERIFY = "Auth-Verify";
+    //ip地址
+    String HEADER_X_SOURCE_IP = "X-Source-IP";
+    String HEADER_BIZ_TYPE = "Biz-Type";
+    String HEADER_CLIENT_TYPE = "Client-Type";
+    String HEADER_USER_AGENT = "user-agent";
+    String HEADER_SIGN_KEY = "tri_coorperation_tech_task";
+    String HEADER_TIMESTAMP = "Timestamp";
+    String HEADER_SEQUENCE = "Sequence";
+    String HEADER_SIGNATURE = "Signature";
+    //认证
+    String HEADER_AUTHORIZATION = "Authorization";
+    //==========================日志格式==========================
+    String EXCEPTION_FORMAT = "{%s:%s}:%s"; //{(ios/apk/pc):url}:error reason
 
-    }
 }

+ 39 - 7
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/domain/ResultResponse.java

@@ -1,8 +1,9 @@
 package com.shkpr.service.customgateway.core.domain;
 
 import com.shkpr.service.customgateway.core.constants.ResponseCode;
-import lombok.Getter;
-import lombok.Setter;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 
 /**
@@ -11,16 +12,47 @@ import org.apache.commons.lang3.StringUtils;
  * @author 欧阳劲驰
  * @since 1.0.0
  */
-@Setter
-@Getter
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class ResultResponse<T> implements Result<T> {
+    /**
+     * 时间戳
+     */
     private long timestamp;
+    /**
+     * 编码
+     */
     private String rescode;
-    private String resmsg;//message;
-    private T resdata;//data;
+    /**
+     * 信息
+     */
+    private String resmsg;
+    /**
+     * 数据
+     */
+    private T resdata;
 
-    public ResultResponse() {
+    /**
+     * 失败
+     *
+     * @param <T> 数据类型
+     * @return 结果
+     */
+    public static <T> ResultResponse<T> failed() {
+        ResultResponse<T> resultResponse = new ResultResponse<>();
+        resultResponse.setRescode(ResponseCode.RESULT_BAD.getCode() + "");
+        resultResponse.setResmsg(ResponseCode.RESULT_BAD.getMessage());
+        return resultResponse;
+    }
 
+    /**
+     * 成功
+     */
+    public void success(T data) {
+        this.setRescode(ResponseCode.RESULT_NORMAL.getCode() + "");
+        this.setResmsg(ResponseCode.RESULT_NORMAL.getMessage());
+        this.setResdata(data);
     }
 
     @Override

+ 25 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/exception/SelfException.java

@@ -0,0 +1,25 @@
+package com.shkpr.service.customgateway.core.exception;
+
+
+public class SelfException extends Exception{
+    private String mStrErrorCode = "";
+    private String mStrErrorData = "";
+    public SelfException(String strErrorCode, String strErrorMsg){
+        super(strErrorMsg);
+        this.mStrErrorCode = strErrorCode;
+    }
+
+    public SelfException(String strErrorCode, String strErrorMsg, String strErrorData){
+        super(strErrorMsg);
+        this.mStrErrorCode = strErrorCode;
+        this.mStrErrorData = strErrorData;
+    }
+
+    public String getStrErrorCode() {
+        return mStrErrorCode;
+    }
+
+    public String getStrErrorData() {
+        return mStrErrorData;
+    }
+}

+ 90 - 0
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/AesUtil.java

@@ -0,0 +1,90 @@
+package com.shkpr.service.customgateway.core.utils;
+
+import org.apache.commons.codec.binary.Base64;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.security.InvalidAlgorithmParameterException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+
+/**
+ * aes
+ */
+public class AesUtil {
+    //加密算法名称
+    private static final String ALGORITHM = "AES";
+    //加密转换规范:算法/模式/填充方案
+    //AES - 加密算法
+    //CBC - 密码块链接模式(需要初始化向量IV)
+    //PKCS5Padding - 填充方案(当数据不是16字节倍数时自动填充)
+    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
+    //初始化向量长度:AES块大小固定为 16 字节(128位)
+    private static final int IV_LENGTH = 16;
+
+    /**
+     * AES加密方法
+     * 使用CBC模式,IV取自密钥的前16字节
+     *
+     * @param plainText 明文文本
+     * @param secretKey 密钥
+     * @return Base64编码的加密结果字符串
+     */
+    public static String encrypt(String plainText, String secretKey) {
+        //密钥规范
+        SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);
+        //从密钥中提取前 16 字节作为初始化向量
+        byte[] ivBytes = Arrays.copyOfRange(secretKey.getBytes(StandardCharsets.UTF_8), 0, IV_LENGTH);
+        //初始化向量参数规范
+        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+        try {
+            //获取密码实例
+            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+            //加密模式,传入密钥和IV参数
+            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
+            //加密密码
+            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
+            //转base64
+            return Base64.encodeBase64String(encryptedBytes);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | IllegalBlockSizeException | BadPaddingException |
+                 InvalidAlgorithmParameterException | InvalidKeyException e) {
+            return null;
+        }
+    }
+
+    /**
+     * AES加密方法
+     * 使用CBC模式,IV取自密钥的前16字节
+     *
+     * @param encryptedText 加密文本
+     * @param secretKey     密钥
+     * @return 明文文本
+     */
+    public static String decrypt(String encryptedText, String secretKey) {
+        //密钥规范
+        SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);
+        //从密钥中提取前 16 字节作为初始化向量
+        byte[] ivBytes = Arrays.copyOfRange(secretKey.getBytes(StandardCharsets.UTF_8), 0, IV_LENGTH);
+        //初始化向量参数规范
+        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
+        try {
+            //获取密码实例
+            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+            //解密模式,传入密钥和IV参数
+            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
+            //解密密码
+            byte[] decryptedBytes = cipher.doFinal(Base64.decodeBase64(encryptedText));
+            //转字符串
+            return new String(decryptedBytes, StandardCharsets.UTF_8);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | IllegalBlockSizeException | BadPaddingException |
+                 InvalidAlgorithmParameterException | InvalidKeyException e) {
+            return null;
+        }
+    }
+}

+ 25 - 9
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/CallingUtil.java

@@ -78,7 +78,7 @@ public class CallingUtil {
     }
 
     /**
-     * 发起请求
+     * 请求对象
      *
      * @param url        请求地址
      * @param method     请求方法
@@ -87,11 +87,10 @@ public class CallingUtil {
      * @param resultType 结果类型
      * @param <R>        结果
      * @param <T>        数据
-     * @return 返回所有分页数据的集合
+     * @return 数据
      */
-    public <R extends Result<List<T>>, T> List<T> request(
-            String url, HttpMethod method, Map<String, ?> params, List<Header> headers, TypeReference<R> resultType
-    ) {
+    public <R extends Result<T>, T> T requestObject(
+            String url, HttpMethod method, Map<String, ?> params, List<Header> headers, TypeReference<R> resultType) {
         try {
             //发起请求
             Response response = buildRequest(url, method, params)
@@ -107,12 +106,29 @@ public class CallingUtil {
             LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_ERROR, mBizType, mStrClassName
                     , String.format("拉取数据失败 error:%s", e)
             );
-            return Collections.emptyList();
+            return null;
         }
     }
 
     /**
-     * 发起滚动请求
+     * 请求数组
+     *
+     * @param url        请求地址
+     * @param method     请求方法
+     * @param params     参数
+     * @param headers    请求头
+     * @param resultType 结果类型
+     * @param <R>        结果
+     * @param <T>        数据
+     * @return 数据集合
+     */
+    public <R extends Result<List<T>>, T> List<T> requestList(
+            String url, HttpMethod method, Map<String, ?> params, List<Header> headers, TypeReference<R> resultType) {
+        return requestObject(url, method, params, headers, resultType);
+    }
+
+    /**
+     * 请求数据页
      *
      * @param url               请求地址
      * @param method            请求方法
@@ -122,9 +138,9 @@ public class CallingUtil {
      * @param <R>               结果
      * @param <P>               分页
      * @param <T>               数据
-     * @return 返回所有分页数据的集合
+     * @return 全部数据页
      */
-    public <R extends Result<P>, P extends PageResponse<T>, T> List<T> scrollRequest(
+    public <R extends Result<P>, P extends PageResponse<T>, T> List<T> requestScroll(
             String url, HttpMethod method, TypeReference<R> resultType,
             Function<Pageable, Map<String, String>> onGenerateParams,
             Function<Map<String, String>, List<Header>> onGenerateHeaders

+ 1 - 1
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/RequestUtil.java

@@ -20,7 +20,7 @@ public class RequestUtil {
      */
     public static String getIpAddress(HttpServletRequest request) {
         //ip头
-        String[] headers = {Api.Headers.X_SOURCE_IP, "X-Real-IP", "X-Forwarded-For", "Proxy-Client-IP",
+        String[] headers = {Api.HEADER_X_SOURCE_IP, "X-Real-IP", "X-Forwarded-For", "Proxy-Client-IP",
                 "WL-Proxy-Client-IP"};
 
         //从头获取ip

+ 20 - 2
custom-gateway-core/src/main/java/com/shkpr/service/customgateway/core/utils/TokenUtil.java

@@ -8,6 +8,8 @@ import com.shkpr.service.customgateway.core.domain.TokenData;
 import com.shkpr.service.customgateway.core.properties.GlobalProperties;
 import com.shkpr.service.customgateway.core.properties.SecurityProperties;
 import io.jsonwebtoken.*;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.CredentialsExpiredException;
@@ -180,7 +182,7 @@ public class TokenUtil {
      */
     public Authentication getAuthentication(HttpServletRequest request) throws IllegalArgumentException, CredentialsExpiredException, BadCredentialsException {
         //获取验证口令
-        final String authVerify = request.getHeader(Api.Headers.AUTH_VERIFY);
+        final String authVerify = request.getHeader(Api.HEADER_AUTH_VERIFY);
         //验证口令通过
         if (StringUtils.equalsIgnoreCase(globalProperties.getInternalCallPassword(), authVerify)) {
             //设置用户和角色信息,并返回token
@@ -192,7 +194,7 @@ public class TokenUtil {
         }
 
         //获取token
-        String token = request.getHeader(Api.Headers.AUTHORIZATION);
+        String token = request.getHeader(Api.HEADER_AUTHORIZATION);
         if (!StringUtils.isNoneBlank(token)) throw new IllegalArgumentException();
 
         //解析token
@@ -215,4 +217,20 @@ public class TokenUtil {
         request.setAttribute(TokenMetadata.RequestAttributes.ROLE_ID, tokenData.getRoleId());
         return CommonToken.authenticated(tokenData, Collections.emptyList());
     }
+
+    /**
+     * 生成临时token
+     *
+     * @param account 登陆账号
+     */
+    public String generateTempToken(String account) {
+        if (StringUtils.isBlank(account)) return null;
+        //加密数据,模式:模式0登录名,模式1用户id,时间戳,随机数,数据
+        String data = String.format("%s%d%s%s", "O",
+                System.currentTimeMillis() / 1000, RandomStringUtils.randomAlphanumeric(8), account);
+        //密钥,转md5,取 8-24 字符(16 字节)
+        String key = DigestUtils.md5Hex(securityProperties.getSecret()).substring(8, 24).toUpperCase();
+        //aes加密
+        return AesUtil.encrypt(data, key);
+    }
 }

+ 1 - 1
custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/components/DataCollector.java

@@ -80,7 +80,7 @@ public class DataCollector {
             //参数
             Map<String, Object> params = ScadaPlatformMetadata.getRealTimeDataParams(Collections.singletonList(device));
             //请求结果项
-            List<ScadaPlatformData> items = callingUtil.request(url, HttpMethod.GET, params, Collections.emptyList(),
+            List<ScadaPlatformData> items = callingUtil.requestList(url, HttpMethod.GET, params, Collections.emptyList(),
                     new TypeReference<ScadaPlatformDataResult<List<ScadaPlatformData>>>() {
                     });
 

+ 1 - 1
custom-gateway-zhscada/src/main/java/com/shkpr/service/customgateway/zhscada/components/InfoSynchronizer.java

@@ -66,7 +66,7 @@ public class InfoSynchronizer {
         Map<String, Object> params = Collections.singletonMap(ScadaPlatformMetadata.Params.PROJECT_NAME,
                 ScadaPlatformMetadata.DefaultValues.PROJECT_NAME);
         //请求结果项
-        List<ScadaPlatformVariables> items = callingUtil.request(url, HttpMethod.GET, params, Collections.emptyList(),
+        List<ScadaPlatformVariables> items = callingUtil.requestList(url, HttpMethod.GET, params, Collections.emptyList(),
                 new TypeReference<ScadaPlatformVariablesResult<List<ScadaPlatformVariables>>>() {
                 });
         LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, BIZ_TYPE, CLASS_NAME

+ 1 - 1
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/DataCollector.java

@@ -112,7 +112,7 @@ public class DataCollector {
             //参数
             Map<String, Object> params = IotPlatformMetadata.getHistoryDataParams(deviceMapping, beginTime, endTime);
             //请求结果项
-            List<IotPlatformData> items = callingUtil.request(url, HttpMethod.POST, params, headers,
+            List<IotPlatformData> items = callingUtil.requestList(url, HttpMethod.POST, params, headers,
                     new TypeReference<IotPlatformResult<List<IotPlatformData>>>() {
                     });
             LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, BIZ_TYPE, CLASS_NAME

+ 29 - 19
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/components/InfoSynchronizer.java

@@ -64,29 +64,12 @@ public class InfoSynchronizer {
         //对接点
         CallingProperties.CallingEndpoint endpoint = callingProperties.getEndpoints().get(MiddlePlatformMetadata.NAME);
 
-        //请求地址
-        String url = endpoint.getUrl() + MiddlePlatformMetadata.Uri.GET_USERS;
-        //请求获取用户
-        List<MiddlePlatformUser> users = callingUtil.scrollRequest(url, HttpMethod.GET,
-                new TypeReference<MiddlePlatformResult<MiddlePlatformPage<MiddlePlatformUser>>>() {
-                }, pageable -> new HashMap<String, String>() {{
-                    put(MiddlePlatformMetadata.Params.PAGE_NUMBER, pageable.getPageNumber() + "");
-                    put(MiddlePlatformMetadata.Params.PAGE_SIZE, pageable.getPageSize() + "");
-                }}, params -> {
-                    //获取密钥
-                    IntegrationKey key = MiddlePlatformMetadata.getKey(endpoint.getAccessKey(), endpoint.getSecretKey(), params);
-                    //存入请求头
-                    return Arrays.asList(
-                            new BasicHeader(MiddlePlatformMetadata.Headers.APP_KEY, key.getAccessKey()),
-                            new BasicHeader(MiddlePlatformMetadata.Headers.TIMESTAMP, key.getTimestamp() + ""),
-                            new BasicHeader(MiddlePlatformMetadata.Headers.SIGN, key.getSecretKey())
-                    );
-                });
+        //获取用户
+        List<MiddlePlatformUser> users = getUsers(endpoint);
 
         //遍历用户
         //todo 用户角色信息获取
 
-
         //转换用户对象
         List<PersonnelInfo> dates = users.stream()
                 .map(MiddlePlatformUser::toPersonnelInfo).collect(Collectors.toList());
@@ -102,4 +85,31 @@ public class InfoSynchronizer {
                 )
         );
     }
+
+    /**
+     * 获取用户
+     *
+     * @param endpoint 对接点
+     * @return 用户列表
+     */
+    private List<MiddlePlatformUser> getUsers(CallingProperties.CallingEndpoint endpoint) {
+        //请求地址
+        String url = endpoint.getUrl() + MiddlePlatformMetadata.Uri.GET_USERS;
+        //请求获取用户
+        return callingUtil.requestScroll(url, HttpMethod.GET,
+                new TypeReference<MiddlePlatformResult<MiddlePlatformPage<MiddlePlatformUser>>>() {
+                }, pageable -> new HashMap<String, String>() {{
+                    put(MiddlePlatformMetadata.Params.PAGE_NUMBER, pageable.getPageNumber() + "");
+                    put(MiddlePlatformMetadata.Params.PAGE_SIZE, pageable.getPageSize() + "");
+                }}, params -> {
+                    //获取密钥
+                    IntegrationKey key = MiddlePlatformMetadata.getKey(endpoint.getAccessKey(), endpoint.getSecretKey(), params);
+                    //存入请求头
+                    return Arrays.asList(
+                            new BasicHeader(MiddlePlatformMetadata.Headers.APP_KEY, key.getAccessKey()),
+                            new BasicHeader(MiddlePlatformMetadata.Headers.TIMESTAMP, key.getTimestamp() + ""),
+                            new BasicHeader(MiddlePlatformMetadata.Headers.SIGN, key.getSecretKey())
+                    );
+                });
+    }
 }

+ 14 - 2
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/constants/MiddlePlatformMetadata.java

@@ -44,9 +44,11 @@ public abstract class MiddlePlatformMetadata extends IntegrationMetadata {
      */
     public interface Uri {
         //获取用户列表
-        String GET_USERS = "/IntegrationAuth/GetUsers";
+        String GET_USERS = "/PandaCore/GCK/IntegrationAuth/GetUsers";
         //获取用户角色信息
-        String ROLE_GROUP_LIST = "/IntegrationAuth/GetUsers";
+        String ROLE_GROUP_LIST = "/PandaOMS/OMS/UserCenter/RoleGroupLis";
+        //根据Ticket获取用户
+        String GET_USER_BY_TICKET = "/PandaOMS/OMS/GetUserByTicket";
     }
 
     /**
@@ -69,6 +71,16 @@ public abstract class MiddlePlatformMetadata extends IntegrationMetadata {
         String PAGE_NUMBER = "pageIndex";
         //分页大小
         String PAGE_SIZE = "pageSize";
+        //ticket
+        String TICKET = "ticket";
+    }
+
+    /**
+     * 结果
+     */
+    public interface Results{
+        //id
+        String ID = "id";
     }
 
 

+ 16 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/controller/ApiController.java

@@ -0,0 +1,16 @@
+package com.shkpr.service.customgateway.zydma.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * api接入controller
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
+ */
+@Controller
+@RequestMapping("api")
+public class ApiController {
+
+}

+ 139 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/controller/UserController.java

@@ -0,0 +1,139 @@
+package com.shkpr.service.customgateway.zydma.controller;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.global.base.log.LogLevelFlag;
+import com.global.base.log.LogPrintMgr;
+import com.shkpr.service.customgateway.core.constants.Api;
+import com.shkpr.service.customgateway.core.constants.LogFlagBusiType;
+import com.shkpr.service.customgateway.core.constants.ResponseCode;
+import com.shkpr.service.customgateway.core.domain.IntegrationKey;
+import com.shkpr.service.customgateway.core.domain.ResultResponse;
+import com.shkpr.service.customgateway.core.exception.SelfException;
+import com.shkpr.service.customgateway.core.properties.CallingProperties;
+import com.shkpr.service.customgateway.core.utils.CallingUtil;
+import com.shkpr.service.customgateway.core.utils.CommTool;
+import com.shkpr.service.customgateway.core.utils.TokenUtil;
+import com.shkpr.service.customgateway.zydma.constants.MiddlePlatformMetadata;
+import com.shkpr.service.customgateway.zydma.domain.MiddlePlatformResult;
+import com.shkpr.service.customgateway.zydma.domain.po.PersonnelInfo;
+import com.shkpr.service.customgateway.zydma.service.PersonnelInfoService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.Header;
+import org.apache.http.message.BasicHeader;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static com.shkpr.service.customgateway.core.constants.Api.URI_USERS_H;
+
+@Controller
+@RequestMapping("${gateway.routes.zydma}" + URI_USERS_H)
+public class UserController {
+    //log
+    private final static String CLASS_NAME = "ApiGisSurveyController";
+    private final static String BIZ_TYPE = LogFlagBusiType.BUSI_DB_USER.toStrValue();
+    /**
+     * 请求序列
+     */
+    final Map<String, AtomicInteger> requestSeq = new ConcurrentHashMap<>();
+    final
+    CallingProperties callingProperties;
+    final
+    PersonnelInfoService personnelInfoService;
+    final
+    TokenUtil tokenUtil;
+    final
+    CallingUtil callingUtil;
+
+    public UserController(CallingProperties callingProperties, PersonnelInfoService personnelInfoService, TokenUtil tokenUtil, CallingUtil callingUtil) {
+        this.callingProperties = callingProperties;
+        this.personnelInfoService = personnelInfoService;
+        this.tokenUtil = tokenUtil;
+        this.callingUtil = callingUtil;
+    }
+
+
+    /**
+     * ticket交换临时token
+     *
+     * @param ticket 门户token
+     * @return 临时token
+     */
+    @GetMapping(value = Api.URI_XXX_TICKET_EXCHANGE)
+    public ResultResponse<String> getUser(
+            HttpServletRequest request,
+            @RequestHeader(value = Api.HEADER_CLIENT_TYPE, required = false) String strClientType,
+            @RequestHeader(value = Api.HEADER_USER_AGENT, required = false) String strUserAgent,
+            @RequestParam(value = "ticket", required = false) String ticket) throws SelfException {
+        //初始化序列
+        requestSeq.putIfAbsent(Api.URI_XXX_TICKET_EXCHANGE, new AtomicInteger(0));
+        final String URI_PATH = request.getRequestURI();
+        final String strPlatform = CommTool.getPlatformByAgent(strClientType, strUserAgent);
+        //参数校验
+        if (ticket == null || StringUtils.isBlank(ticket)) {
+            throw new SelfException(ResponseCode.STATUS_ERROR_JSON_FORMAT.getCode() + ""
+                    , String.format(Api.EXCEPTION_FORMAT
+                    , strPlatform
+                    , URI_PATH
+                    , ResponseCode.STATUS_ERROR_JSON_FORMAT.getMessage()));
+        }
+
+        //begin
+        long begin = System.currentTimeMillis();
+        String seqMsg = String.format("%d-%d", begin, requestSeq.get(Api.URI_XXX_TICKET_EXCHANGE).incrementAndGet());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, BIZ_TYPE, CLASS_NAME
+                , String.format("%s:%s seq:{%s} param:%s begin====>", strPlatform, URI_PATH, seqMsg, ticket));
+        //构建result
+        ResultResponse<String> resultResponse = ResultResponse.failed();
+
+        //===========================请求用户信息===========================
+        //接入点
+        CallingProperties.CallingEndpoint endpoint = callingProperties.getEndpoints().get(MiddlePlatformMetadata.NAME);
+        //地址
+        String url = endpoint.getUrl() + MiddlePlatformMetadata.Uri.GET_USER_BY_TICKET;
+        //参数
+        Map<String, String> params = Collections.singletonMap(MiddlePlatformMetadata.Params.TICKET, "ed23d0c4afed4a9e96a23a99a874fe6425536f4364e649c4874968b29027d1fc");
+        //密钥
+        IntegrationKey key = MiddlePlatformMetadata.getKey(endpoint.getAccessKey(), endpoint.getSecretKey(), params);
+        //请求头
+        List<Header> headers = Arrays.asList(
+                new BasicHeader(MiddlePlatformMetadata.Headers.APP_KEY, key.getAccessKey()),
+                new BasicHeader(MiddlePlatformMetadata.Headers.TIMESTAMP, key.getTimestamp() + ""),
+                new BasicHeader(MiddlePlatformMetadata.Headers.SIGN, key.getSecretKey())
+        );
+
+        //获取用户
+        Map<String, Object> user = callingUtil.requestObject(url, HttpMethod.GET, params, headers, new TypeReference<MiddlePlatformResult<Map<String, Object>>>() {
+        });
+        //获取用户id
+        String userId = user != null ? String.valueOf(user.getOrDefault(MiddlePlatformMetadata.Results.ID, null)) : null;
+
+        //===========================签发临时token===========================
+        //查询用户
+        PersonnelInfo personnelInfo = personnelInfoService.findByUserId(userId);
+        if (personnelInfo != null && personnelInfo.getAccount() != null) {
+            //签发临时token
+            String tempToken = tokenUtil.generateTempToken(personnelInfo.getAccount());
+            if (StringUtils.isNotBlank(tempToken)) resultResponse.success(tempToken);
+        }
+
+        //end
+        resultResponse.setTimestamp(System.currentTimeMillis());
+        LogPrintMgr.getInstance().printLogMsg(LogLevelFlag.LOG_INFO, BIZ_TYPE, CLASS_NAME,
+                String.format("%s:%s seq:{%s} rescode:{%s} resmsg:{%s} time:{%d ms} end<===="
+                        , strPlatform, URI_PATH, seqMsg, resultResponse.getRescode(), resultResponse.getResmsg()
+                        , resultResponse.getTimestamp() - begin));
+        return resultResponse;
+    }
+}

+ 3 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/domain/MiddlePlatformUser.java

@@ -8,6 +8,9 @@ import java.util.Objects;
 
 /**
  * 中台用户
+ *
+ * @author 欧阳劲驰
+ * @since 1.0.0
  */
 @Data
 public class MiddlePlatformUser {

+ 8 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/mapper/primary/PersonnelInfoMapper.java

@@ -15,6 +15,14 @@ import java.util.List;
 @Mapper
 public interface PersonnelInfoMapper {
     /**
+     * 根据uid查询
+     *
+     * @param uid uid
+     * @return 实体
+     */
+    PersonnelInfo findBydUid(@Param("uid") String uid);
+
+    /**
      * 查询已存在的id
      *
      * @param ids 查询的ids

+ 8 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/PersonnelInfoService.java

@@ -18,4 +18,12 @@ public interface PersonnelInfoService {
      * @return 合并状态
      */
     Boolean upsertAll(List<PersonnelInfo> dates);
+
+    /**
+     * 根据用户id查询
+     *
+     * @param userId 用户id
+     * @return 用户
+     */
+    PersonnelInfo findByUserId(String userId);
 }

+ 13 - 0
custom-gateway-zydma/src/main/java/com/shkpr/service/customgateway/zydma/service/impl/PersonnelInfoServiceImpl.java

@@ -8,6 +8,7 @@ import com.shkpr.service.customgateway.zydma.domain.po.PersonnelInfo;
 import com.shkpr.service.customgateway.zydma.mapper.primary.PersonnelInfoMapper;
 import com.shkpr.service.customgateway.zydma.service.PersonnelInfoService;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.session.ExecutorType;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
@@ -121,4 +122,16 @@ public class PersonnelInfoServiceImpl implements PersonnelInfoService {
             }
         }
     }
+
+    /**
+     * 根据用户id查询
+     *
+     * @param userId 用户id
+     * @return 用户
+     */
+    @Override
+    public PersonnelInfo findByUserId(String userId) {
+        if (StringUtils.isBlank(userId)) return null;
+        return personnelInfoMapper.findBydUid(userId);
+    }
 }

+ 23 - 0
custom-gateway-zydma/src/main/resources/mapper/PersonnelInfoMapper.xml

@@ -8,6 +8,29 @@
             #{id}
         </foreach>
     </select>
+    <select id="findBydUid" resultType="com.shkpr.service.customgateway.zydma.domain.po.PersonnelInfo">
+        select id,
+               uid,
+               account,
+               password,
+               real_name,
+               address,
+               sex,
+               phone,
+               email,
+               avatar,
+               role_id,
+               dept_id,
+               post_id,
+               status,
+               param1,
+               param2,
+               create_time,
+               update_time,
+               org
+        from k2_personnel_info
+        where uid = #{uid,jdbcType=VARCHAR}
+    </select>
 
     <insert id="save">
         insert into k2_personnel_info

BIN
libs/gbase.1.0.5.jar


+ 4 - 0
pom.xml

@@ -78,6 +78,10 @@
             <artifactId>commons-lang3</artifactId>
         </dependency>
         <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+        </dependency>
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-text</artifactId>
             <version>${common.text.version}</version>