diff --git a/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContext.java b/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContext.java index 05cc3d4..17a8a21 100644 --- a/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContext.java +++ b/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContext.java @@ -21,6 +21,7 @@ public class AxContext { private static final TransmittableThreadLocal CONTEXT = new TransmittableThreadLocal(); private static final TransmittableThreadLocal REQUEST = new TransmittableThreadLocal(); + private String terminal; private AxUser axUser; private Long ouId; private Long workspaceId; @@ -46,9 +47,9 @@ public class AxContext { } - public static void init() { + public static AxContext initByHeaders() { if (!getRequest().isPresent()) { - return; + return null; } HttpServletRequest request = getRequest().get(); AxContext context = AxContext.builder().build(); @@ -56,7 +57,7 @@ public class AxContext { .map(e -> e.getFiller().apply(request, context)) .toArray(Boolean[]::new); //所有的header设置成功才算成功 - set(context); + return context; } public Long getPersonId() { @@ -109,9 +110,18 @@ public class AxContext { } context.setWorkspaceId(Long.parseLong(workspaceIdHeader)); return true; + }), + TERMINAL("终端", (request, context) -> { + context.setTerminal(request.getHeader("terminal")); + return true; }); private final String desc; private final BiFunction filler; } + + public static void main(String[] args) { + String userStr = new String(BaseEncoding.base64().decode("eyJhcHBWZXJzaW9uIjoiMCIsImF2YXRhclVybCI6Imh0dHBzOi8vYXh6by1hcHAub3NzLWNuLWNoZW5nZHUuYWxpeXVuY3MuY29tL2ZhY2UvNzBiNTVjYTctNDdjNC00MDc3LTlkMjgtMTRkMWY3ZTFkZGMxLmpwZyIsInNleCI6IjIiLCJpcEFkZHJlc3MiOiIxMC4wLjMuMjI1IiwiYWNjdElkIjo5MDAwMzk5NDI5LCJsb2dpbkRldmljZSI6Ik5UX0NNU19XRUJfR0VORVJBTCIsInRlcm1pbmFsIjoiTlRfQ01TX1dFQl9HRU5FUkFMIiwidXNlcklkIjoyMDA2MjM0LCJlbmFibGVkIjp0cnVlLCJhY250SWQiOjkwMDAzOTk0MjksInJlYWxOYW1lIjoi5oi/5b+D6ZmIIiwiZmFjZVVybCI6Imh0dHBzOi8vYXh6by10ZXN0Lm9zcy1jbi1jaGVuZ2R1LmFsaXl1bmNzLmNvbS9pZGNhcmQvaWRmYWNldXJsLzU5NDgyMTg4ODU0MjAyNjUwNzA2NTYxLmpwZyIsInBob25lTnVtYmVyIjoiMTg1ODMyNTg3OTgiLCJpZEZhY2VVcmwiOiJodHRwczovL2F4em8tdGVzdC5vc3MtY24tY2hlbmdkdS5hbGl5dW5jcy5jb20vaWRjYXJkL2lkZmFjZXVybC81OTQ4MjE4ODg1NDIwMjY1MDcwNjU2MS5qcGciLCJ2ZXJpZnlTdGF0dXMiOiJWRVJJRllfU1VDQ0VTUyIsImlkZW50aXR5VHlwZSI6MywiaWRlbnRpdHlJZCI6MjAwNjIzNCwidmVyaWZpZWRTdGF0dXMiOjIsInBlcnNvbklkIjo5MDAwMzk5NDI5LCJpZCI6OTAwMDM5OTQyOSwibGVnYWN5R3Vlc3MiOnsiZ3Vlc3NTYWFzVGVuYW50IjoiX19OT19ORUVEX18iLCJzYWFzVGVuYW50SWQiOjAsImd1ZXNzVGVybWluYWwiOiJfX05PX05FRURfXyIsIm5ld1Rlcm1pbmFsIjoiIiwiZ3Vlc3NPVSI6Il9fTk9fTkVFRF9fIiwib3VJZCI6MCwib3VUeXBlIjowLCJndWVzc1dvcmtzcGFjZSI6Il9fTk9fTkVFRF9fIiwid29ya3NwYWNlSWQiOjAsIndvcmtzcGFjZVR5cGUiOjAsIndvcmtzcGFjZUpvaW5UeXBlIjowfSwiYXh6b0lkIjo5MDAwMzk5NDI5fQ=="), Charsets.UTF_8); + System.out.printf(userStr); + } } diff --git a/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContextInterceptor.java b/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContextInterceptor.java index 444a1eb..b5356fc 100644 --- a/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContextInterceptor.java +++ b/web-support-lib/src/main/java/cn/axzo/foundation/web/support/context/AxContextInterceptor.java @@ -1,7 +1,6 @@ package cn.axzo.foundation.web.support.context; import cn.axzo.foundation.enums.AppEnvEnum; -import cn.axzo.foundation.result.ResultCode; import cn.axzo.foundation.web.support.AppRuntime; import cn.axzo.foundation.web.support.rpc.HttpClient; import cn.axzo.foundation.web.support.rpc.OkHttpClientImpl; @@ -12,7 +11,6 @@ import com.google.common.collect.ImmutableMap; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; -import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; @@ -35,23 +33,37 @@ public class AxContextInterceptor implements HandlerInterceptor { private final static HttpClient HTTP_CLIENT = OkHttpClientImpl.builder().build(); private final static Map ENV_HOSTS = ImmutableMap.of( - AppEnvEnum.local, "http://test-api.axzo.cn/pudge/webApi/oauth/apisix/authentication", - AppEnvEnum.dev, "http://dev-app.axzo.cn/pudge/webApi/oauth/apisix/authentication", - AppEnvEnum.test, "http://test-api.axzo.cn/pudge/webApi/oauth/apisix/authentication", - AppEnvEnum.pre, "http://pre-api.axzo.cn/pudge/webApi/oauth/apisix/authentication" + AppEnvEnum.local, "http://test-api.axzo.cn", + AppEnvEnum.dev, "http://dev-app.axzo.cn", + AppEnvEnum.test, "http://test-api.axzo.cn", + AppEnvEnum.pre, "http://pre-api.axzo.cn" ); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { AxContext.clear(); AxContext.setRequest(request); - AxContext.init(); + + AxContext context = Optional.ofNullable(AxContext.initByHeaders()).orElse(AxContext.builder() + .build()); String authorization = request.getHeader("Authorization"); -// if (!Strings.isNullOrEmpty(authorization) && appRuntime.getEnv() != AppEnvEnum.prd) { -// return initByAuthorization(authorization, request); -// } - + if (!Strings.isNullOrEmpty(authorization) && appRuntime.getEnv() == AppEnvEnum.local) { + AxContext authContext = tryGetContextAuthorization(authorization, request); + if (authContext.getAxUser() != null) { + context.setAxUser(authContext.getAxUser()); + } + if (authContext.getOuId() != null) { + context.setOuId(authContext.getOuId()); + } + if (authContext.getWorkspaceId() != null) { + context.setWorkspaceId(authContext.getWorkspaceId()); + } + if (authContext.getTerminal() != null) { + context.setTerminal(authContext.getTerminal()); + } + } + AxContext.set(context); return true; } @@ -66,41 +78,35 @@ public class AxContextInterceptor implements HandlerInterceptor { * 明文格式: authentication: Raw {ouid:xxx, axUser:{personId:xxx}} * puge接口返回结果参考 test.resources.authentication.json */ - private boolean initByAuthorization(String authorization, HttpServletRequest request) { - AxContext context = null; + private AxContext tryGetContextAuthorization(String authorization, HttpServletRequest request) { if (authorization.startsWith("Raw")) { - context = JSONObject.parseObject(StringUtils.removeStart(authorization, "Raw "), AxContext.class); + return JSONObject.parseObject(StringUtils.removeStart(authorization, "Raw "), AxContext.class); } if (authorization.startsWith("Bearer")) { String result; - String url = StringUtils.firstNonBlank(supplierHost, ENV_HOSTS.get(appRuntime.getEnv())); + String url = StringUtils.firstNonBlank(supplierHost, ENV_HOSTS.get(appRuntime.getEnv()) + "/pudge/webApi/oauth/apisix/authentication"); try { result = HTTP_CLIENT.get(url, RequestParams.FormParams.builder() - .headers(ImmutableMap.of("Authorization", authorization)) + .headers(ImmutableMap.of("Authorization", authorization, + "terminal", request.getHeader("terminal"))) .logEnable(true) .build()); } catch (Exception ex) { log.error("获取登陆信息错误, url = {}, authorization = {}", url, authorization, ex); - throw ResultCode.RUNTIME_EXCEPTION.toException("获取登陆信息错误" + ex.getMessage()); + return null; } //这里是一个非标准返回 JSONObject resultJSON = JSONObject.parseObject(result); if (BooleanUtils.isNotTrue(resultJSON.getBoolean("approve"))) { - throw ResultCode.RUNTIME_EXCEPTION.toException(resultJSON.getString("msg")); + return null; } JSONObject userinfo = resultJSON.getJSONObject("userinfo"); - context = AxContext.builder() - .ouId(ObjectUtils.firstNonNull(Optional.ofNullable(request.getHeader("Ouid")).map(Long::parseLong).orElse(null), - userinfo.getLong("ouId"))) - .workspaceId(ObjectUtils.firstNonNull(Optional.ofNullable(request.getHeader("Workspaceid")).map(Long::parseLong).orElse(null), - userinfo.getLong("workspaceId"))) + return AxContext.builder() + .ouId(userinfo.getLong("ouId")) + .workspaceId(userinfo.getLong("workspaceId")) .axUser(userinfo.toJavaObject(AxUser.class)) .build(); } - if (context != null) { - AxContext.set(context); - return true; - } - return false; + return null; } } diff --git a/web-support-lib/src/main/java/cn/axzo/foundation/web/support/rpc/RpcClient.java b/web-support-lib/src/main/java/cn/axzo/foundation/web/support/rpc/RpcClient.java index c3e81e0..9a2fad1 100644 --- a/web-support-lib/src/main/java/cn/axzo/foundation/web/support/rpc/RpcClient.java +++ b/web-support-lib/src/main/java/cn/axzo/foundation/web/support/rpc/RpcClient.java @@ -106,7 +106,7 @@ public interface RpcClient { }); } - Set AXZO_HEADERS = ImmutableSet.of("workspaceId", "ouId", "Authorization"); + Set AXZO_HEADERS = ImmutableSet.of("workspaceId", "ouId", "Authorization", "terminal"); // XXX: http/2会把所有Header都转成小写, 历史定义的Header都是大写的,在http/2协议下会透传失败。 TreeSet CASE_INSENSITIVE_AXZO_HEADERS = AXZO_HEADERS.stream()