feat: 优化获取登陆信息

This commit is contained in:
zengxiaobo 2024-05-27 18:09:37 +08:00
parent 9bc4b8d281
commit 15854e5f63
3 changed files with 48 additions and 32 deletions

View File

@ -21,6 +21,7 @@ public class AxContext {
private static final TransmittableThreadLocal<AxContext> CONTEXT = new TransmittableThreadLocal();
private static final TransmittableThreadLocal<HttpServletRequest> 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<HttpServletRequest, AxContext, Boolean> filler;
}
public static void main(String[] args) {
String userStr = new String(BaseEncoding.base64().decode("eyJhcHBWZXJzaW9uIjoiMCIsImF2YXRhclVybCI6Imh0dHBzOi8vYXh6by1hcHAub3NzLWNuLWNoZW5nZHUuYWxpeXVuY3MuY29tL2ZhY2UvNzBiNTVjYTctNDdjNC00MDc3LTlkMjgtMTRkMWY3ZTFkZGMxLmpwZyIsInNleCI6IjIiLCJpcEFkZHJlc3MiOiIxMC4wLjMuMjI1IiwiYWNjdElkIjo5MDAwMzk5NDI5LCJsb2dpbkRldmljZSI6Ik5UX0NNU19XRUJfR0VORVJBTCIsInRlcm1pbmFsIjoiTlRfQ01TX1dFQl9HRU5FUkFMIiwidXNlcklkIjoyMDA2MjM0LCJlbmFibGVkIjp0cnVlLCJhY250SWQiOjkwMDAzOTk0MjksInJlYWxOYW1lIjoi5oi/5b+D6ZmIIiwiZmFjZVVybCI6Imh0dHBzOi8vYXh6by10ZXN0Lm9zcy1jbi1jaGVuZ2R1LmFsaXl1bmNzLmNvbS9pZGNhcmQvaWRmYWNldXJsLzU5NDgyMTg4ODU0MjAyNjUwNzA2NTYxLmpwZyIsInBob25lTnVtYmVyIjoiMTg1ODMyNTg3OTgiLCJpZEZhY2VVcmwiOiJodHRwczovL2F4em8tdGVzdC5vc3MtY24tY2hlbmdkdS5hbGl5dW5jcy5jb20vaWRjYXJkL2lkZmFjZXVybC81OTQ4MjE4ODg1NDIwMjY1MDcwNjU2MS5qcGciLCJ2ZXJpZnlTdGF0dXMiOiJWRVJJRllfU1VDQ0VTUyIsImlkZW50aXR5VHlwZSI6MywiaWRlbnRpdHlJZCI6MjAwNjIzNCwidmVyaWZpZWRTdGF0dXMiOjIsInBlcnNvbklkIjo5MDAwMzk5NDI5LCJpZCI6OTAwMDM5OTQyOSwibGVnYWN5R3Vlc3MiOnsiZ3Vlc3NTYWFzVGVuYW50IjoiX19OT19ORUVEX18iLCJzYWFzVGVuYW50SWQiOjAsImd1ZXNzVGVybWluYWwiOiJfX05PX05FRURfXyIsIm5ld1Rlcm1pbmFsIjoiIiwiZ3Vlc3NPVSI6Il9fTk9fTkVFRF9fIiwib3VJZCI6MCwib3VUeXBlIjowLCJndWVzc1dvcmtzcGFjZSI6Il9fTk9fTkVFRF9fIiwid29ya3NwYWNlSWQiOjAsIndvcmtzcGFjZVR5cGUiOjAsIndvcmtzcGFjZUpvaW5UeXBlIjowfSwiYXh6b0lkIjo5MDAwMzk5NDI5fQ=="), Charsets.UTF_8);
System.out.printf(userStr);
}
}

View File

@ -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<AppEnvEnum, String> 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;
}
}

View File

@ -106,7 +106,7 @@ public interface RpcClient {
});
}
Set<String> AXZO_HEADERS = ImmutableSet.of("workspaceId", "ouId", "Authorization");
Set<String> AXZO_HEADERS = ImmutableSet.of("workspaceId", "ouId", "Authorization", "terminal");
// XXX: http/2会把所有Header都转成小写, 历史定义的Header都是大写的在http/2协议下会透传失败
TreeSet<String> CASE_INSENSITIVE_AXZO_HEADERS = AXZO_HEADERS.stream()