mirror of
https://github.com/tencentmusic/supersonic.git
synced 2025-12-10 19:51:00 +00:00
(improvement)(headless) Opt logic of obtaining faker user (#2014)
* (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:
@@ -1,20 +1,13 @@
|
|||||||
package com.tencent.supersonic.auth.authentication.interceptor;
|
package com.tencent.supersonic.auth.authentication.interceptor;
|
||||||
|
|
||||||
import com.tencent.supersonic.auth.api.authentication.config.AuthenticationConfig;
|
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.service.UserServiceImpl;
|
||||||
import com.tencent.supersonic.auth.authentication.utils.TokenService;
|
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 lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.catalina.connector.RequestFacade;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.tomcat.util.http.MimeHeaders;
|
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
import org.springframework.web.servlet.HandlerInterceptor;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -27,8 +20,6 @@ public abstract class AuthenticationInterceptor implements HandlerInterceptor {
|
|||||||
|
|
||||||
protected TokenService tokenService;
|
protected TokenService tokenService;
|
||||||
|
|
||||||
protected S2ThreadContext s2ThreadContext;
|
|
||||||
|
|
||||||
protected boolean isExcludedUri(String uri) {
|
protected boolean isExcludedUri(String uri) {
|
||||||
String excludePathStr = authenticationConfig.getExcludePath();
|
String excludePathStr = authenticationConfig.getExcludePath();
|
||||||
if (StringUtils.isEmpty(excludePathStr)) {
|
if (StringUtils.isEmpty(excludePathStr)) {
|
||||||
@@ -53,52 +44,4 @@ public abstract class AuthenticationInterceptor implements HandlerInterceptor {
|
|||||||
return includePaths.stream().anyMatch(uri::startsWith);
|
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.api.authentication.pojo.UserWithPassword;
|
||||||
import com.tencent.supersonic.auth.authentication.service.UserServiceImpl;
|
import com.tencent.supersonic.auth.authentication.service.UserServiceImpl;
|
||||||
import com.tencent.supersonic.auth.authentication.utils.TokenService;
|
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.pojo.exception.AccessException;
|
||||||
import com.tencent.supersonic.common.util.ContextUtils;
|
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 io.jsonwebtoken.Claims;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
@@ -35,19 +32,10 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor
|
|||||||
authenticationConfig = ContextUtils.getBean(AuthenticationConfig.class);
|
authenticationConfig = ContextUtils.getBean(AuthenticationConfig.class);
|
||||||
userServiceImpl = ContextUtils.getBean(UserServiceImpl.class);
|
userServiceImpl = ContextUtils.getBean(UserServiceImpl.class);
|
||||||
tokenService = ContextUtils.getBean(TokenService.class);
|
tokenService = ContextUtils.getBean(TokenService.class);
|
||||||
s2ThreadContext = ContextUtils.getBean(S2ThreadContext.class);
|
|
||||||
if (!authenticationConfig.isEnabled()) {
|
if (!authenticationConfig.isEnabled()) {
|
||||||
setFakerUser(request);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (isInternalRequest(request)) {
|
|
||||||
setFakerUser(request);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (isAppRequest(request)) {
|
|
||||||
setFakerUser(request);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (handler instanceof HandlerMethod) {
|
if (handler instanceof HandlerMethod) {
|
||||||
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
HandlerMethod handlerMethod = (HandlerMethod) handler;
|
||||||
Method method = handlerMethod.getMethod();
|
Method method = handlerMethod.getMethod();
|
||||||
@@ -68,35 +56,11 @@ public class DefaultAuthenticationInterceptor extends AuthenticationInterceptor
|
|||||||
|
|
||||||
UserWithPassword user = getUserWithPassword(request);
|
UserWithPassword user = getUserWithPassword(request);
|
||||||
if (user != null) {
|
if (user != null) {
|
||||||
setContext(user.getName(), request);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
throw new AccessException("authentication failed, please login");
|
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) {
|
public UserWithPassword getUserWithPassword(HttpServletRequest request) {
|
||||||
final Optional<Claims> claimsOptional = tokenService.getClaims(request);
|
final Optional<Claims> claimsOptional = tokenService.getClaims(request);
|
||||||
if (!claimsOptional.isPresent()) {
|
if (!claimsOptional.isPresent()) {
|
||||||
|
|||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.tencent.supersonic.common.util;
|
package com.tencent.supersonic.common.util;
|
||||||
|
|
||||||
|
import com.tencent.supersonic.common.pojo.User;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
@@ -13,7 +14,7 @@ public class ThreadContext {
|
|||||||
|
|
||||||
private String traceId;
|
private String traceId;
|
||||||
|
|
||||||
private String userName;
|
private User user;
|
||||||
|
|
||||||
private String token;
|
private String token;
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ package com.tencent.supersonic.headless.api.pojo;
|
|||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class DataSetDetail {
|
public class DataSetDetail {
|
||||||
|
|
||||||
private List<DataSetModelConfig> dataSetModelConfigs;
|
private List<DataSetModelConfig> dataSetModelConfigs = Collections.emptyList();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ public class DataSetReq extends SchemaItem {
|
|||||||
|
|
||||||
private Long domainId;
|
private Long domainId;
|
||||||
|
|
||||||
private DataSetDetail dataSetDetail;
|
private DataSetDetail dataSetDetail = new DataSetDetail();
|
||||||
|
|
||||||
private String alias;
|
private String alias;
|
||||||
|
|
||||||
|
|||||||
@@ -627,7 +627,7 @@ public class ModelServiceImpl implements ModelService {
|
|||||||
private DataItem getDataItem(ModelDO modelDO) {
|
private DataItem getDataItem(ModelDO modelDO) {
|
||||||
return DataItem.builder().id(modelDO.getId().toString()).name(modelDO.getName())
|
return DataItem.builder().id(modelDO.getId().toString()).name(modelDO.getName())
|
||||||
.bizName(modelDO.getBizName()).modelId(modelDO.getId().toString())
|
.bizName(modelDO.getBizName()).modelId(modelDO.getId().toString())
|
||||||
.domainId(modelDO.getDomainId().toString()).type(TypeEnums.DIMENSION).build();
|
.domainId(modelDO.getDomainId().toString()).type(TypeEnums.MODEL).build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,4 +40,4 @@ s2:
|
|||||||
value:
|
value:
|
||||||
threshold: 0.5
|
threshold: 0.5
|
||||||
min:
|
min:
|
||||||
threshold: 0.3
|
threshold: 0.3
|
||||||
|
|||||||
Reference in New Issue
Block a user