diff --git a/auth-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java b/auth-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java deleted file mode 100644 index bc047da..0000000 --- a/auth-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java +++ /dev/null @@ -1,100 +0,0 @@ -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.RequestInfo; -import cn.axzo.framework.auth.domain.UserInfo; -import cn.axzo.framework.auth.domain.UserInfoMap; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.codec.Base64; -import cn.hutool.core.lang.TypeReference; -import cn.hutool.json.JSONUtil; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.aspectj.lang.ProceedingJoinPoint; -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.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import java.lang.reflect.Method; -import java.util.Map; -import java.util.Objects; - - -@Slf4j -@Aspect -@Component -public class BuilderUserInfoAspect { - - @Around(value = "@annotation(preBuildUser)") - public Object methodHandler(ProceedingJoinPoint pjp, PreBuildUser preBuildUser) throws Throwable { - HttpServletRequest httpRequest = null; - try { - //获取request - httpRequest = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); - } catch (Exception exception) { -// log.error("can not get request,there is a error occurrence"+ exception.printStackTrace();); - } - //todo request 为null - assert httpRequest != null; - Class requestInfoClass = preBuildUser.requestInfo(); - this.fillInUserInfoDetail(httpRequest, pjp, requestInfoClass); - return pjp.proceed(); - } - - public void fillInUserInfoDetail(HttpServletRequest request, ProceedingJoinPoint pjp, Class requestInfoClass) { - String userJsonInfo = request.getHeader(AopConstants.USER_INFO); - //转编码 - String userInfo = Base64.decodeStr(userJsonInfo); - - MethodSignature methodSignature = (MethodSignature) pjp.getSignature(); - Method method = methodSignature.getMethod(); - Class[] parameterTypes = method.getParameterTypes(); - Object[] pjpArgs = pjp.getArgs(); - for (int i = 0; i < parameterTypes.length; i++) { - if (UserInfo.class.isAssignableFrom(parameterTypes[i])) { - UserInfo pjpArg = (UserInfo) pjpArgs[i]; - buildRequestInfo(pjpArg, request, requestInfoClass); - if (StringUtils.isEmpty(userJsonInfo)) { - //没有拿到用户信息这个构建也没有意义了 //todo 做个异常处理 - return; - } - buildUserInfo(pjpArg, userInfo); - break; - } - } - } - - @SneakyThrows - private void buildRequestInfo(UserInfo userInfo, HttpServletRequest request, Class requestInfoClass) { - RequestInfo requestInfo = userInfo.getRequestInfo(); - if (Objects.isNull(requestInfo)) { - requestInfo = requestInfoClass.newInstance(); - userInfo.setRequestInfo(requestInfo); - } - // 请求头获取数据 - requestInfo.setAppVersion(request.getHeader(AopConstants.HAEDER_APP_VERSION)); - requestInfo.setDeviceKind(request.getHeader(AopConstants.HAEDER_DEVICE_KIND)); - requestInfo.setDeviceNo(request.getHeader(AopConstants.HAEDER_DEVICE_NO)); - requestInfo.setSystemType(request.getHeader(AopConstants.HEADER_SYSTEM_TYPE)); - requestInfo.setTenantId(request.getHeader(AopConstants.HEADER_TENANT)); - requestInfo.setVisitTo(request.getHeader(AopConstants.VISIT_TO)); - requestInfo.setToken(request.getHeader(AopConstants.HEADER_AUTH)); - requestInfo.buildCustomRequestInfo(request); - } - - public void buildUserInfo(UserInfo userInfo, String userJsonInfo) { - TypeReference> mapTypeReference = new TypeReference>(){}; - Map map = JSONUtil.toBean(userJsonInfo, mapTypeReference, false); - //对bean进行封装属性 - BeanUtil.fillBeanWithMap(map, userInfo, false); - - userInfo.buildCustomUserInfo(new UserInfoMap(map)); - - } -} 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/axzo-auth-spring-boot-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 new file mode 100644 index 0000000..5d38c49 --- /dev/null +++ b/axzo-auth-spring-boot-starter/src/main/java/cn/axzo/framework/auth/service/BuilderUserInfoAspect.java @@ -0,0 +1,173 @@ +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.RequestInfo; +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.axzo.framework.auth.domain.UserInfoMap; +import cn.hutool.core.lang.TypeReference; +import cn.hutool.json.JSONUtil; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +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.Assert; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.Objects; + + +@Slf4j +@Aspect +@Component +public class BuilderUserInfoAspect { + + @Around(value = "@annotation(preBuildUser)") + public Object methodHandler(ProceedingJoinPoint pjp, PreBuildUser preBuildUser) throws Throwable { + HttpServletRequest httpRequest = null; + try { + //获取request + httpRequest = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); + } catch (Exception exception) { + log.error("can not get request,there is a error occurrence ==>" + exception.getCause().getMessage()); + } + Assert.notNull(httpRequest, "httpReqeust cant be null, this is error"); + this.fillInUserInfoDetail(httpRequest, pjp); + //todo request 为null + assert httpRequest != null; + this.fillInUserInfoDetail(httpRequest, pjp, preBuildUser.requestInfo()); + return pjp.proceed(); + } + + public void fillInUserInfoDetail(HttpServletRequest request, ProceedingJoinPoint pjp) { + //请求头获取数据 + String tenantId = request.getHeader(AopConstants.HEADER_TENANT); + String systemType = request.getHeader(AopConstants.HEADER_SYSTEM_TYPE); + String authorization = request.getHeader(AopConstants.HEADER_AUTH); + String deviceKind = request.getHeader(AopConstants.HAEDER_DEVICE_KIND); + String deviceNo = request.getHeader(AopConstants.HAEDER_DEVICE_NO); + 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(); + Object[] pjpArgs = pjp.getArgs(); + for (int i = 0; i < parameterTypes.length; i++) { + if (parameterTypes[i].isAssignableFrom(UserInfo.class)) { + UserInfo pjpArg = (UserInfo) pjpArgs[i]; + buildUserInfoWithAspect(pjpArg, userinfoJson); + //塞一些系统参数 + pjpArg.setAppVersion(appVersion); + pjpArg.setDeviceKind(deviceKind); + pjpArg.setDeviceNo(deviceNo); + pjpArg.setSystemType(systemType); + pjpArg.setTenantId(tenantId); + pjpArg.setVisitTo(visitTo); + pjpArg.setToken(authorization); + break; + } + } + } + + public void buildUserInfoWithAspect(UserInfo userInfo, String userJsonInfo) { + //todo 直接获取用户信息。 + Map map = JSONUtil.toBean(userJsonInfo, Map.class); + 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"); + } + @SneakyThrows + private void buildRequestInfo(UserInfo userInfo, HttpServletRequest request, Class requestInfoClass) { + RequestInfo requestInfo = userInfo.getRequestInfo(); + if (Objects.isNull(requestInfo)) { + requestInfo = requestInfoClass.newInstance(); + userInfo.setRequestInfo(requestInfo); + } + // 请求头获取数据 + requestInfo.setAppVersion(request.getHeader(AopConstants.HAEDER_APP_VERSION)); + requestInfo.setDeviceKind(request.getHeader(AopConstants.HAEDER_DEVICE_KIND)); + requestInfo.setDeviceNo(request.getHeader(AopConstants.HAEDER_DEVICE_NO)); + requestInfo.setSystemType(request.getHeader(AopConstants.HEADER_SYSTEM_TYPE)); + requestInfo.setTenantId(request.getHeader(AopConstants.HEADER_TENANT)); + requestInfo.setVisitTo(request.getHeader(AopConstants.VISIT_TO)); + requestInfo.setToken(request.getHeader(AopConstants.HEADER_AUTH)); + requestInfo.buildCustomRequestInfo(request); + } + + public void buildUserInfo(UserInfo userInfo, String userJsonInfo) { + TypeReference> mapTypeReference = new TypeReference>(){}; + Map map = JSONUtil.toBean(userJsonInfo, mapTypeReference, false); + //对bean进行封装属性 + BeanUtil.fillBeanWithMap(map, userInfo, false); + + userInfo.buildCustomUserInfo(new UserInfoMap(map)); + + } + +} 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