(improvement)(headless) Opt logic of obtaining faker user (#2014)
Some checks failed
supersonic CentOS CI / build (21) (push) Has been cancelled
supersonic mac CI / build (21) (push) Has been cancelled
supersonic ubuntu CI / build (21) (push) Has been cancelled
supersonic windows CI / build (21) (push) Has been cancelled

* (improvement)(headless) opt logic of obtaining faker user

* (improvement)(headless) Fill in default values for data set creating

* (improvement)(headless) modify dataEvent type when creating model

---------

Co-authored-by: lxwcodemonkey
This commit is contained in:
LXW
2025-01-19 14:59:33 +08:00
committed by GitHub
parent 65f0096724
commit be5eeae707
9 changed files with 9 additions and 134 deletions

View File

@@ -1,20 +1,13 @@
package com.tencent.supersonic.auth.authentication.interceptor;
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
import com.tencent.supersonic.auth.api.authentication.constant.UserConstants;
import com.tencent.supersonic.auth.authentication.service.UserServiceImpl;
import com.tencent.supersonic.auth.authentication.utils.TokenService;
import com.tencent.supersonic.common.util.S2ThreadContext;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.catalina.connector.RequestFacade;
import org.apache.commons.lang3.StringUtils;
import org.apache.tomcat.util.http.MimeHeaders;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
import org.springframework.web.servlet.HandlerInterceptor;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
@@ -27,8 +20,6 @@ public abstract class AuthenticationInterceptor implements HandlerInterceptor {
protected TokenService tokenService;
protected S2ThreadContext s2ThreadContext;
protected boolean isExcludedUri(String uri) {
String excludePathStr = authenticationConfig.getExcludePath();
if (StringUtils.isEmpty(excludePathStr)) {
@@ -53,52 +44,4 @@ public abstract class AuthenticationInterceptor implements HandlerInterceptor {
return includePaths.stream().anyMatch(uri::startsWith);
}
protected boolean isInternalRequest(HttpServletRequest request) {
String internal = request.getHeader(UserConstants.INTERNAL);
return "true".equalsIgnoreCase(internal);
}
protected boolean isAppRequest(HttpServletRequest request) {
String appId = request.getHeader(authenticationConfig.getAppId());
return StringUtils.isNotBlank(appId);
}
protected void reflectSetParam(HttpServletRequest request, String key, String value) {
try {
if (request instanceof StandardMultipartHttpServletRequest) {
RequestFacade servletRequest =
(RequestFacade) ((StandardMultipartHttpServletRequest) request)
.getRequest();
Class<? extends HttpServletRequest> servletRequestClazz = servletRequest.getClass();
Field request1 = servletRequestClazz.getDeclaredField("request");
request1.setAccessible(true);
Object o = request1.get(servletRequest);
Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
coyoteRequest.setAccessible(true);
Object o1 = coyoteRequest.get(o);
Field headers = o1.getClass().getDeclaredField("headers");
headers.setAccessible(true);
MimeHeaders o2 = (MimeHeaders) headers.get(o1);
if (o2.getValue(key) != null) {
o2.setValue(key).setString(value);
} else {
o2.addValue(key).setString(value);
}
} else {
Class<? extends HttpServletRequest> requestClass = request.getClass();
Field request1 = requestClass.getDeclaredField("request");
request1.setAccessible(true);
Object o = request1.get(request);
Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
coyoteRequest.setAccessible(true);
Object o1 = coyoteRequest.get(o);
Field headers = o1.getClass().getDeclaredField("headers");
headers.setAccessible(true);
MimeHeaders o2 = (MimeHeaders) headers.get(o1);
o2.addValue(key).setString(value);
}
} catch (Exception e) {
log.error("reflectSetParam error:", e);
}
}
}

View File

@@ -5,11 +5,8 @@ import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfi
import com.tencent.supersonic.auth.api.authentication.pojo.UserWithPassword;
import com.tencent.supersonic.auth.authentication.service.UserServiceImpl;
import com.tencent.supersonic.auth.authentication.utils.TokenService;
import com.tencent.supersonic.common.pojo.User;
import com.tencent.supersonic.common.pojo.exception.AccessException;
import com.tencent.supersonic.common.util.ContextUtils;
import com.tencent.supersonic.common.util.S2ThreadContext;
import com.tencent.supersonic.common.util.ThreadContext;
import io.jsonwebtoken.Claims;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@@ -35,19 +32,10 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor
authenticationConfig = ContextUtils.getBean(AuthenticationConfig.class);
userServiceImpl = ContextUtils.getBean(UserServiceImpl.class);
tokenService = ContextUtils.getBean(TokenService.class);
s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class);
if (!authenticationConfig.isEnabled()) {
setFakerUser(request);
return true;
}
if (isInternalRequest(request)) {
setFakerUser(request);
return true;
}
if (isAppRequest(request)) {
setFakerUser(request);
return true;
}
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
@@ -68,35 +56,11 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor
UserWithPassword user = getUserWithPassword(request);
if (user != null) {
setContext(user.getName(), request);
return true;
}
throw new AccessException("authentication failed, please login");
}
private void setFakerUser(HttpServletRequest request) {
String token = generateAdminToken(request);
reflectSetParam(request, authenticationConfig.getTokenHttpHeaderKey(), token);
setContext(User.getDefaultUser().getName(), request);
}
private void setContext(String userName, HttpServletRequest request) {
ThreadContext threadContext = ThreadContext.builder()
.token(request.getHeader(authenticationConfig.getTokenHttpHeaderKey()))
.userName(userName).build();
s2ThreadContext.set(threadContext);
}
public String generateAdminToken(HttpServletRequest request) {
UserWithPassword admin = new UserWithPassword("admin");
admin.setId(1L);
admin.setName("admin");
admin.setPassword("c3VwZXJzb25pY0BiaWNvbdktJJYWw6A3rEmBUPzbn/6DNeYnD+y3mAwDKEMS3KVT");
admin.setDisplayName("admin");
admin.setIsAdmin(1);
return tokenService.generateToken(UserWithPassword.convert(admin), request);
}
public UserWithPassword getUserWithPassword(HttpServletRequest request) {
final Optional<Claims> claimsOptional = tokenService.getClaims(request);
if (!claimsOptional.isPresent()) {

View File

@@ -1,14 +0,0 @@
package com.tencent.supersonic.common.config;
import com.tencent.supersonic.common.util.S2ThreadContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ThreadContextConfig {
@Bean
public S2ThreadContext s2ThreadContext() {
return new S2ThreadContext();
}
}

View File

@@ -1,21 +0,0 @@
package com.tencent.supersonic.common.util;
import com.alibaba.ttl.TransmittableThreadLocal;
public class S2ThreadContext {
private static final TransmittableThreadLocal<ThreadContext> context =
new TransmittableThreadLocal<>();
public ThreadContext get() {
return context.get();
}
public void set(ThreadContext value) {
context.set(value);
}
public void remove() {
context.remove();
}
}

View File

@@ -1,5 +1,6 @@
package com.tencent.supersonic.common.util;
import com.tencent.supersonic.common.pojo.User;
import lombok.Builder;
import lombok.Data;
import lombok.ToString;
@@ -13,7 +14,7 @@ public class ThreadContext {
private String traceId;
private String userName;
private User user;
private String token;

View File

@@ -2,10 +2,12 @@ package com.tencent.supersonic.headless.api.pojo;
import lombok.Data;
import java.util.Collections;
import java.util.List;
@Data
public class DataSetDetail {
private List<DataSetModelConfig> dataSetModelConfigs;
private List<DataSetModelConfig> dataSetModelConfigs = Collections.emptyList();
}

View File

@@ -12,7 +12,7 @@ public class DataSetReq extends SchemaItem {
private Long domainId;
private DataSetDetail dataSetDetail;
private DataSetDetail dataSetDetail = new DataSetDetail();
private String alias;

View File

@@ -627,7 +627,7 @@ public class ModelServiceImpl implements ModelService {
private DataItem getDataItem(ModelDO modelDO) {
return DataItem.builder().id(modelDO.getId().toString()).name(modelDO.getName())
.bizName(modelDO.getBizName()).modelId(modelDO.getId().toString())
.domainId(modelDO.getDomainId().toString()).type(TypeEnums.DIMENSION).build();
.domainId(modelDO.getDomainId().toString()).type(TypeEnums.MODEL).build();
}
}

View File

@@ -40,4 +40,4 @@ s2:
value:
threshold: 0.5
min:
threshold: 0.3
threshold: 0.3