feat: 优化获取登陆信息
This commit is contained in:
parent
9bc4b8d281
commit
15854e5f63
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user