Kaynağa Gözat

内部接口鉴权

dengsixing 1 ay önce
ebeveyn
işleme
294f7fd7cb

+ 57 - 0
httpclient/FdkankanMiniClient.java

@@ -0,0 +1,57 @@
+//package com.fdkankan.scene.httpclient;
+//
+//import com.dtflys.forest.annotation.Get;
+//import com.dtflys.forest.annotation.Header;
+//import com.dtflys.forest.annotation.Post;
+//import com.dtflys.forest.annotation.Retry;
+//import com.dtflys.forest.annotation.Success;
+//import com.dtflys.forest.annotation.Var;
+//import com.dtflys.forest.callback.OnError;
+//import com.dtflys.forest.callback.OnSuccess;
+//import com.fdkankan.common.response.Result;
+//import java.util.Map;
+//import com.fdkankan.scene.bean.CameraBean;
+//import com.fdkankan.scene.bean.UserIncrementBean;
+//import com.fdkankan.scene.callback.FdkkMiniReqSuccessCondition;
+//
+///**
+// * <p>
+// * TODO
+// * </p>
+// *
+// * @author dengsixing
+// * @since 2022/4/24
+// **/
+//@Success(condition = FdkkMiniReqSuccessCondition.class)
+//public interface FdkankanMiniClient {
+//
+//    @Get(url="{url}"
+////        ,interceptor = TLogForestInterceptor.class    加这个拦截器,打印的tlog日志会详细一些,包括头信息等等
+//    )
+//    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+//    Result<String> getDataSyncType(@Var("url") String url, OnSuccess<Result> onSuccess, OnError onError);
+//
+//    @Get("{url}")
+//    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+//    Result<UserIncrementBean> getUserIncrementByCameraId(@Var("url") String url, OnSuccess<Result> onSuccess, OnError onError);
+//
+//    @Get("{url}")
+//    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+//    Result<CameraBean> getCameraByCameraId(@Var("url") String url, OnSuccess<Result> onSuccess, OnError onError);
+//
+////    @Get(url="{url}")
+////    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+////    Result<SceneProV3> getSceneProByNum(@Var("url") String url, OnSuccess<Result> onSuccess, OnError onError);
+//
+//    @Post(url="{url}")
+//    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+//    Result<Map<String, Object>> getIsLogin(@Var("url") String url, @Header("token") String token, OnSuccess<Result> onSuccess, OnError onError);
+//
+////    @Post(
+////        url = "${url}",
+////        contentType = "application/json"
+////    )
+////    @Retry(maxRetryCount = "3", maxRetryInterval = "100")
+////    Result upgradeToV4ResultSync(@Var("url") String url, @Body RequestSceneProV4 param, OnSuccess<Result> onSuccess, OnError onError);
+//
+//}

+ 33 - 0
httpclient/MyClient.java

@@ -0,0 +1,33 @@
+package com.fdkankan.scene.httpclient;
+
+
+import com.dtflys.forest.annotation.Get;
+import com.dtflys.forest.annotation.Var;
+import com.dtflys.forest.callback.OnProgress;
+import com.dtflys.forest.extensions.DownloadFile;
+import com.fdkankan.web.response.ResultData;
+
+import java.io.File;
+
+public interface MyClient {
+
+    /**
+     * 在方法上加上@DownloadFile注解
+     * dir属性表示文件下载到哪个目录
+     * filename属性表示文件下载成功后以什么名字保存,如果不填,这默认从URL中取得文件名
+     * OnProgress参数为监听上传进度的回调函数
+     */
+    @Get(url = "{url}")
+    @DownloadFile(dir = "{dir}", filename = "{filename}")
+    File downloadFile(@Var("url") String url, @Var("dir") String dir, @Var("filename")String filename);
+
+    /**
+     * 在方法上加上@DownloadFile注解
+     * dir属性表示文件下载到哪个目录
+     * filename属性表示文件下载成功后以什么名字保存,如果不填,这默认从URL中取得文件名
+     * OnProgress参数为监听上传进度的回调函数
+     */
+    @Get(url = "${url}?${params}")
+    ResultData get(@Var("url") String url, @Var("params") String params);
+
+}

+ 12 - 0
pom.xml

@@ -194,6 +194,18 @@
       <version>2.17.0</version>
     </dependency>
 
+    <dependency>
+      <groupId>com.fdkankan</groupId>
+      <artifactId>4dkankan-utils-sign</artifactId>
+      <version>3.0.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.dtflys.forest</groupId>
+      <artifactId>forest-spring-boot-starter</artifactId>
+      <version>1.5.19</version>
+    </dependency>
+
   </dependencies>
   <build>
     <finalName>${artifactId}</finalName>

+ 90 - 0
src/main/java/com/fdkankan/contro/Interceptor/SignVerificationAspect.java

@@ -0,0 +1,90 @@
+package com.fdkankan.contro.Interceptor;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.ServerCode;
+import com.fdkankan.common.exception.BusinessException;
+import com.fdkankan.contro.common.Result;
+import com.fdkankan.contro.httpclient.MyClient;
+import com.fdkankan.sign.RsaUtils;
+import lombok.extern.log4j.Log4j2;
+import org.apache.commons.collections.map.HashedMap;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+@Log4j2
+@Aspect
+@Component
+@Order(101)
+public class SignVerificationAspect {
+
+	private static final String GET_PRIVATEKEY_API = "/ucenter/_inner/pdsfsdfsrvateddsfeky/";
+
+	@Value("${ucenter.publicKey}")
+	private String publicKey;
+
+	@Value("${fdService.basePath}")
+	private String fdServiceBasePath;
+
+	@Resource
+	private MyClient myClient;
+
+	/**
+	 * 前置通知 用于判断用户协作场景是否有协作权限
+	 *
+	 * @param joinPoint
+	 *            切点
+	 * @throws IOException
+	 */
+	@Before("@annotation(com.fdkankan.contro.SignVerification)")
+	public void doBefore(JoinPoint joinPoint) throws Exception {
+		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+		// 读取session中的用户
+		String sign = request.getHeader("sign");
+		String appId = request.getHeader("appId");
+		if(StrUtil.isEmpty(sign) || StrUtil.isEmpty(appId)){
+			throw new BusinessException(ErrorCode.AUTH_FAIL);
+		}
+
+		//通过appid查询私钥
+		Instant now = Instant.now();
+		long epochSecond = now.getEpochSecond();
+		JSONObject playload = new JSONObject();
+		playload.put("appId", "ucenter");
+		playload.put("timestamp", epochSecond);
+		String ucenterSign = RsaUtils.encipher(playload.toJSONString(), publicKey);
+		Map<String, String> headerMap = new HashMap<>();
+		headerMap.put("sign", ucenterSign);
+		headerMap.put("appId", "ucenter")
+		String url = fdServiceBasePath + GET_PRIVATEKEY_API + "ucenter";
+		Result result = myClient.get(url, headerMap);
+		if(result.getCode() != ServerCode.SUCCESS.code()){
+			throw new RuntimeException("系统异常");
+		}
+		String privateKey = (String) result.getData();
+
+		//签名解密
+
+		//校验appid是否合法
+
+		//校验时间戳是否有效
+
+
+	}
+
+}

+ 2 - 0
src/main/java/com/fdkankan/contro/ModelingControlApplication.java

@@ -1,5 +1,6 @@
 package com.fdkankan.contro;
 
+import com.dtflys.forest.springboot.annotation.ForestScan;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -22,6 +23,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
 @EnableAsync
 @MapperScan("com.fdkankan.**.mapper")
 @EnableDiscoveryClient
+@ForestScan(basePackages = "com.fdkankan.contro.httpclient")
 public class ModelingControlApplication {
     public static void main(String[] args) {
         SpringApplication.run(ModelingControlApplication.class, args);

+ 10 - 0
src/main/java/com/fdkankan/contro/annotation/SignVerification.java

@@ -0,0 +1,10 @@
+package com.fdkankan.contro.annotation;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.PARAMETER, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface SignVerification {
+    String description() default "";
+}

+ 16 - 0
src/main/java/com/fdkankan/contro/httpclient/MyClient.java

@@ -0,0 +1,16 @@
+package com.fdkankan.contro.httpclient;
+
+
+import com.dtflys.forest.annotation.Get;
+import com.dtflys.forest.annotation.Header;
+import com.dtflys.forest.annotation.Var;
+import com.fdkankan.contro.common.Result;
+
+import java.util.Map;
+
+public interface MyClient {
+
+    @Get(url = "${url}")
+    Result get(@Var("url") String url, @Header Map<String, String> headerMap);
+
+}

+ 5 - 0
src/main/resources/bootstrap-dev.yml

@@ -33,6 +33,11 @@ spring:
           - data-id: common-scaling.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: forest-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 4 - 0
src/main/resources/bootstrap-pro.yml

@@ -37,6 +37,10 @@ spring:
           - data-id: common-logback-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: forest-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}

+ 4 - 0
src/main/resources/bootstrap-test.yml

@@ -37,6 +37,10 @@ spring:
           - data-id: common-logback-config.yaml
             group: DEFAULT_GROUP
             refresh: true
+
+          - data-id: forest-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
       discovery:
         server-addr: ${spring.cloud.nacos.config.server-addr}
         namespace: ${spring.cloud.nacos.config.namespace}