From 9a2b15165e033ea574b7ec99d1dc6367bf1e8d0d Mon Sep 17 00:00:00 2001 From: zhuguanghong Date: Tue, 26 Apr 2022 14:54:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pom.xml | 22 +++++- .../auth/annotation/PreBuildUser.java | 0 .../auth/constants/AopConstants.java | 4 + .../cn/axzo/framework/auth/enums/EnvEnum.java | 35 +++++++++ .../auth/service/BuilderUserInfoAspect.java | 77 +++++++++++++++---- .../main/resources/META-INF/spring.factories | 1 + pom.xml | 3 +- 7 files changed, 122 insertions(+), 20 deletions(-) rename {auth-starter => axzo-auth-spring-boot-starter}/pom.xml (84%) rename {auth-starter => axzo-auth-spring-boot-starter}/src/main/java/cn/axzo/framework/auth/annotation/PreBuildUser.java (100%) rename {auth-starter => axzo-auth-spring-boot-starter}/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java (91%) create mode 100644 axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/enums/EnvEnum.java rename {auth-starter => axzo-auth-spring-boot-starter}/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java (52%) create mode 100644 axzo-auth-spring-boot-starter/src/main/resources/META-INF/spring.factories diff --git a/auth-starter/pom.xml b/axzo-auth-spring-boot-starter/pom.xml similarity index 84% rename from auth-starter/pom.xml rename to axzo-auth-spring-boot-starter/pom.xml index 0a55f90..cffceca 100644 --- a/auth-starter/pom.xml +++ b/axzo-auth-spring-boot-starter/pom.xml @@ -9,10 +9,10 @@ cn.axzo.framework - auth-starter - 1.0.0 - auth-starter - auth-starter + axzo-auth-spring-boot-starter + 1.0.1 + axzo-auth-spring-boot-starter + axzo-auth-spring-boot-starter 8 @@ -24,6 +24,13 @@ org.springframework.boot spring-boot-starter + provided + + + org.springframework.boot + spring-boot-configuration-processor + true + provided @@ -72,6 +79,13 @@ org.slf4j slf4j-api 2.0.0-alpha1 + provided + + + + cn.axzo.framework + common-common + 1.1.5 diff --git a/auth-starter/src/main/java/cn/axzo/framework/auth/annotation/PreBuildUser.java b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/annotation/PreBuildUser.java similarity index 100% rename from auth-starter/src/main/java/cn/axzo/framework/auth/annotation/PreBuildUser.java rename to axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/annotation/PreBuildUser.java diff --git a/auth-starter/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java similarity index 91% rename from auth-starter/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java rename to axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java index ac716ea..251d5f5 100644 --- a/auth-starter/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java +++ b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/constants/AopConstants.java @@ -9,6 +9,10 @@ public class AopConstants { public static final String HAEDER_APP_VERSION = "appVersion"; public static final String VISIT_TO = "visitTo"; public static final String USER_INFO = "userinfo"; + public static final String ENV_DEV="dev"; + + + diff --git a/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/enums/EnvEnum.java b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/enums/EnvEnum.java new file mode 100644 index 0000000..2db7067 --- /dev/null +++ b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/enums/EnvEnum.java @@ -0,0 +1,35 @@ +package cn.axzo.framework.auth.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum EnvEnum { + // dev + DEV("dev", "http://dev-api.axzo.cn/pudge/webApi/oauth/user"), + // TEST + TEST("TEST", "http://test-api.axzo.cn/pudge/webApi/oauth/user"), + //TEST1 + TEST1("TEST1", "http://test1-api.axzo.cn/pudge/webApi/oauth/user"), + //PRE + PRE("PRE", "http://dev-api.axzo.cn/pudge/webApi/oauth/user"), + ; + private String key; + private String value; + + public static String getValueByKey(String key) { + try { + for(EnvEnum env:EnvEnum.values()) { + if(env.getKey().equals(key)) { + return env.getValue(); + } + } + }catch(Exception e) { + return "未知"; + } + return "未知"; + } + + +} diff --git a/auth-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java similarity index 52% rename from auth-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java rename to axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java index 94b6fe9..ab47ba2 100644 --- a/auth-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java +++ b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java @@ -3,8 +3,13 @@ package cn.axzo.framework.auth.service; import cn.axzo.framework.auth.annotation.PreBuildUser; import cn.axzo.framework.auth.constants.AopConstants; import cn.axzo.framework.auth.domain.UserInfo; +import cn.axzo.framework.auth.enums.EnvEnum; +import cn.azxo.framework.common.logger.logback.PodNamespacePropertyDefiner; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.codec.Base64; +import cn.hutool.core.util.StrUtil; +import cn.hutool.http.HttpException; +import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -12,7 +17,7 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; +import org.springframework.util.Assert; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -34,22 +39,14 @@ public class BuilderUserInfoAspect { //获取request httpRequest = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); } catch (Exception exception) { -// log.error("can not get request,there is a error occurrence"+ exception.printStackTrace();); + log.error("can not get request,there is a error occurrence ==>" + exception.getCause().getMessage()); } - //todo request 为null - assert httpRequest != null; + Assert.notNull(httpRequest, "httpReqeust cant be null, this is error"); this.fillInUserInfoDetail(httpRequest, pjp); return pjp.proceed(); } public void fillInUserInfoDetail(HttpServletRequest request, ProceedingJoinPoint pjp) { - String userJsonInfo = request.getHeader(AopConstants.USER_INFO); - if (StringUtils.isEmpty(userJsonInfo)) { - //没有拿到用户信息这个构建也没有意义了 //todo 做个异常处理 - return; - } - //转编码 - String userInfo = Base64.decodeStr(userJsonInfo); //请求头获取数据 String tenantId = request.getHeader(AopConstants.HEADER_TENANT); String systemType = request.getHeader(AopConstants.HEADER_SYSTEM_TYPE); @@ -59,6 +56,47 @@ public class BuilderUserInfoAspect { String appVersion = request.getHeader(AopConstants.HAEDER_APP_VERSION); String visitTo = request.getHeader(AopConstants.VISIT_TO); + String userinfoJson = ""; + //本地运行 分两种情况 postMan/junit + //判断本地环境 + if (this.getSystemProperties() == null) { + //如果本地环境 有两种如果是postman类型调用手动调用pudge + String url = ""; + String token = request.getHeader("Authorization"); + if (StrUtil.isEmpty(token)) { + // 硬逻辑 如果不携带token 可理解为junit测试 这里不覆盖 Userinfo的信息 + return; + } else { + //postman调用 + String customerEnv = this.getCustomerEnv(); + customerEnv = StrUtil.isEmpty(customerEnv) ? AopConstants.ENV_DEV : customerEnv; + url = EnvEnum.getValueByKey(customerEnv); + if (StrUtil.isEmpty(url)) { + throw new RuntimeException("There is no correct path to request"); + } + String response = ""; + try { + response = HttpRequest.get(url).header("Authorization", token).execute().body(); + } catch (HttpException e) { + throw new RuntimeException("call pudge get/user error."); + } + //如果返回了 user信息 进行构建 + if (StrUtil.isEmpty(response)) { + throw new RuntimeException("not find user by token from pudge"); + } + userinfoJson = response; + + } + } else { + //走 apisix 获取的请求 + String userJsonInfo = request.getHeader(AopConstants.USER_INFO); + Assert.notNull(userJsonInfo,"do not have userinfo error , please check apisix config is correct"); + //转编码 + userinfoJson = Base64.decodeStr(userJsonInfo); + + } + + MethodSignature methodSignature = (MethodSignature) pjp.getSignature(); Method method = methodSignature.getMethod(); Class[] parameterTypes = method.getParameterTypes(); @@ -66,7 +104,7 @@ public class BuilderUserInfoAspect { for (int i = 0; i < parameterTypes.length; i++) { if (parameterTypes[i].isAssignableFrom(UserInfo.class)) { UserInfo pjpArg = (UserInfo) pjpArgs[i]; - buildUserInfoWithAspect(pjpArg, userInfo); + buildUserInfoWithAspect(pjpArg, userinfoJson); //塞一些系统参数 pjpArg.setAppVersion(appVersion); pjpArg.setDeviceKind(deviceKind); @@ -83,8 +121,19 @@ public class BuilderUserInfoAspect { public void buildUserInfoWithAspect(UserInfo userInfo, String userJsonInfo) { //todo 直接获取用户信息。 Map map = JSONUtil.toBean(userJsonInfo, Map.class); -// Map data = (Map) map.get("data"); - //对bean进行封装属性 BeanUtil.fillBeanWithMap(map, userInfo, false); } + + //从env/properties 获取my_pod_namespace 的value + public String getSystemProperties() { + PodNamespacePropertyDefiner podNamespacePropertyDefiner = new PodNamespacePropertyDefiner(); + return podNamespacePropertyDefiner.getPropertyValue(); + } + + // 从本地拿 CUSTOM_ENV的值 + public String getCustomerEnv() { + PodNamespacePropertyDefiner podNamespacePropertyDefiner = new PodNamespacePropertyDefiner(); + return (String) podNamespacePropertyDefiner.getSystemProperties().get("CUSTOM_ENV"); + } + } diff --git a/axzo-auth-spring-boot-starter/src/main/resources/META-INF/spring.factories b/axzo-auth-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..aec11ac --- /dev/null +++ b/axzo-auth-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.axzo.framework.auth.config.UserInfoConfiguration \ No newline at end of file diff --git a/pom.xml b/pom.xml index c94566f..3298e1a 100644 --- a/pom.xml +++ b/pom.xml @@ -17,8 +17,7 @@ asyncTool alarm-spring-boot-starter canal-alarm - - auth-starter + axzo-auth-spring-boot-starter