| @@ -3,6 +3,7 @@ package com.xueyi.common.security.interceptor; | |||
| import com.xueyi.common.core.constant.basic.SecurityConstants; | |||
| import com.xueyi.common.core.constant.basic.TenantConstants; | |||
| import com.xueyi.common.core.context.SecurityContextHolder; | |||
| import com.xueyi.common.core.utils.JwtUtil; | |||
| import com.xueyi.common.core.utils.ServletUtil; | |||
| import com.xueyi.common.core.utils.core.ObjectUtil; | |||
| import com.xueyi.common.core.utils.core.StrUtil; | |||
| @@ -43,6 +44,11 @@ public class HeaderInterceptor implements AsyncHandlerInterceptor { | |||
| System.err.println(SecurityUtils.getAccountType()); | |||
| if (StrUtil.isNotEmpty(token)) { | |||
| SecurityContextHolder.setEnterpriseId(JwtUtil.getEnterpriseId(token)); | |||
| SecurityContextHolder.setSourceName(JwtUtil.getSourceName(token)); | |||
| SecurityContextHolder.setAccountType(JwtUtil.getAccountType(token)); | |||
| SecurityContextHolder.set(SecurityConstants.FROM_SOURCE, SecurityConstants.INNER); | |||
| TenantConstants.AccountType accountType = TenantConstants.AccountType.getByCode(SecurityUtils.getAccountType()); | |||
| if(ObjectUtil.isNotNull(accountType)) { | |||
| AuthUtil.verifyLoginUserExpire(token, accountType); | |||
| @@ -24,7 +24,7 @@ public class WebApiMvcConfig implements WebMvcConfigurer { | |||
| System.err.println("WebMvcConfig.addInterceptors======================hshshkbb"); | |||
| registry.addInterceptor(getApiInterceptor()) | |||
| .addPathPatterns("/8888") | |||
| .addPathPatterns("/**/graphql/**") | |||
| // .addPathPatterns("/**") | |||
| .excludePathPatterns(excludeUrls) | |||
| .order(1); | |||
| @@ -42,6 +42,9 @@ public class ApiRequestInterceptor implements HandlerInterceptor { | |||
| String deviceId = request.getHeader("deviceId"); | |||
| logger.info("请求头参数:deviceId={}", deviceId); | |||
| String token = request.getHeader("Authorization"); | |||
| logger.info("请求头参数:Authorization={}", token); | |||
| /* String str = DecodeRequestUtils.getRequestPostStr(request); | |||
| logger.info("请求参数:{}", str); | |||
| @@ -138,12 +138,13 @@ | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.graphql-java</groupId> | |||
| <artifactId>graphql-java</artifactId> | |||
| <version>11.0</version> | |||
| <groupId>com.graphql-java-kickstart</groupId> | |||
| <artifactId>graphql-spring-boot-starter</artifactId> | |||
| <version>14.0.0</version> | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.alibaba</groupId> | |||
| <artifactId>easyexcel</artifactId> | |||
| @@ -151,11 +152,7 @@ | |||
| </dependency> | |||
| <dependency> | |||
| <groupId>com.github.binarywang</groupId> | |||
| <artifactId>weixin-java-miniapp</artifactId> | |||
| <version>4.6.0</version> | |||
| </dependency> | |||
| </dependencies> | |||
| @@ -0,0 +1,64 @@ | |||
| package com.xueyi.system.intercepts; | |||
| import com.xueyi.common.core.constant.basic.SecurityConstants; | |||
| import com.xueyi.common.core.context.SecurityContextHolder; | |||
| import com.xueyi.common.core.utils.JwtUtil; | |||
| import com.xueyi.common.security.service.TokenService; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.stereotype.Component; | |||
| import org.springframework.web.filter.OncePerRequestFilter; | |||
| import javax.servlet.FilterChain; | |||
| import javax.servlet.ServletException; | |||
| import javax.servlet.http.HttpServletRequest; | |||
| import javax.servlet.http.HttpServletResponse; | |||
| import java.io.IOException; | |||
| /** | |||
| * @author yk | |||
| * @description | |||
| * @date 2024-01-04 22:40 | |||
| */ | |||
| @Component | |||
| public class GraphqlRequestFilter extends OncePerRequestFilter { | |||
| Logger logger = LoggerFactory.getLogger(GraphqlRequestFilter.class); | |||
| @Override | |||
| protected void doFilterInternal( | |||
| HttpServletRequest request, | |||
| HttpServletResponse response, | |||
| FilterChain filterChain | |||
| ) throws ServletException, IOException { | |||
| // 获取请求路径 | |||
| String requestURI = request.getRequestURI(); | |||
| logger.info("Request URI: {}", requestURI); | |||
| // 判断是否是 GraphQL 请求 | |||
| if (requestURI != null && requestURI.contains("/graphql")) { | |||
| String token = request.getHeader("Authorization"); | |||
| logger.info("token: {}", token); | |||
| token = token.replace("Bearer ", ""); | |||
| logger.error("enterpriseId: {}, sourceName:{}, enterpriseName:{}, accountType:{}", JwtUtil.getEnterpriseId(token), JwtUtil.getSourceName(token), JwtUtil.getEnterpriseName(token), JwtUtil.getAccountType(token)); | |||
| SecurityContextHolder.setEnterpriseId(JwtUtil.getEnterpriseId(token)); | |||
| SecurityContextHolder.setSourceName(JwtUtil.getSourceName(token)); | |||
| SecurityContextHolder.setAccountType(JwtUtil.getAccountType(token)); | |||
| SecurityContextHolder.set(SecurityConstants.FROM_SOURCE, SecurityConstants.INNER); | |||
| logger.error("getAccountType:{}",SecurityContextHolder.getAccountType()); | |||
| logger.info("Authorization: {}", token); | |||
| // 在这里进行鉴权等处理 | |||
| // ... | |||
| // 继续处理 GraphQL 请求 | |||
| filterChain.doFilter(request, response); | |||
| } else { | |||
| // 不是 GraphQL 请求,继续处理其他请求 | |||
| filterChain.doFilter(request, response); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,41 @@ | |||
| package com.xueyi.system.staff.graphql; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.staff.domain.model.DmVisitorsConverter; | |||
| import com.xueyi.system.staff.mapper.DmVisitorsMapper; | |||
| import graphql.kickstart.tools.GraphQLMutationResolver; | |||
| import graphql.kickstart.tools.GraphQLQueryResolver; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.List; | |||
| import java.util.stream.Collectors; | |||
| /* | |||
| * @author yk | |||
| * @description | |||
| * @date 2023-12-25 19:55 | |||
| */ | |||
| @Component | |||
| class VisitorGraphQLMutationResolver implements GraphQLMutationResolver { | |||
| @Autowired | |||
| private DmVisitorsMapper mapper; | |||
| @Autowired | |||
| private DmVisitorsConverter converter; | |||
| public Boolean update(Long id, String phone, String name, String nickName){ | |||
| DmVisitorsPo dto = mapper.selectById(id); | |||
| if (dto == null) return null; | |||
| dto.setPhone(phone); | |||
| dto.setNickname(nickName); | |||
| dto.setName(name); | |||
| return mapper.updateById(dto) > 0; | |||
| } | |||
| public Boolean delete(Long id){ | |||
| return mapper.deleteById(id) > 0; | |||
| } | |||
| } | |||
| @@ -1,24 +1,23 @@ | |||
| /* | |||
| package com.xueyi.system.staff.graphql; | |||
| import com.coxautodev.graphql.tools.GraphQLQueryResolver; | |||
| import com.xueyi.system.api.digitalmans.domain.dto.DmVisitorsDto; | |||
| import com.xueyi.system.api.digitalmans.domain.po.DmVisitorsPo; | |||
| import com.xueyi.system.staff.domain.model.DmVisitorsConverter; | |||
| import com.xueyi.system.staff.mapper.DmVisitorsMapper; | |||
| import graphql.kickstart.tools.GraphQLQueryResolver; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.List; | |||
| import java.util.stream.Collectors; | |||
| */ | |||
| /** | |||
| /* | |||
| * @author yk | |||
| * @description | |||
| * @date 2023-12-25 19:55 | |||
| *//* | |||
| */ | |||
| @Service | |||
| @Component | |||
| class VisitorGraphQLQueryResolver implements GraphQLQueryResolver { | |||
| @Autowired | |||
| private DmVisitorsMapper mapper; | |||
| @@ -26,12 +25,11 @@ class VisitorGraphQLQueryResolver implements GraphQLQueryResolver { | |||
| @Autowired | |||
| private DmVisitorsConverter converter; | |||
| public DmVisitorsPo findOneVisitor(Long id){ | |||
| return mapper.selectById(id); | |||
| public DmVisitorsDto selectOne(Long id){ | |||
| return converter.mapperDto(mapper.selectById(id)); | |||
| } | |||
| public List<DmVisitorsPo> getVisitorList(){ | |||
| public List<DmVisitorsDto> list(){ | |||
| return mapper.selectList(null).stream().map(t->converter.mapperDto(t)).collect(Collectors.toList()); | |||
| } | |||
| } | |||
| */ | |||
| @@ -0,0 +1,92 @@ | |||
| package com.xueyi.system.staff.graphql.config; | |||
| import graphql.ExecutionResult; | |||
| import graphql.GraphQL; | |||
| import graphql.GraphQLContext; | |||
| import graphql.execution.instrumentation.ExecutionStrategyInstrumentationContext; | |||
| import graphql.execution.instrumentation.InstrumentationContext; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationExecuteOperationParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationExecutionParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationExecutionStrategyParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationFieldFetchParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationFieldParameters; | |||
| import graphql.execution.instrumentation.parameters.InstrumentationValidationParameters; | |||
| import graphql.kickstart.autoconfigure.tools.GraphQLJavaToolsAutoConfiguration; | |||
| import graphql.kickstart.execution.instrumentation.NoOpInstrumentationProvider; | |||
| import graphql.kickstart.tools.GraphQLResolver; | |||
| import graphql.kickstart.tools.SchemaParser; | |||
| import graphql.language.Document; | |||
| import graphql.scalars.ExtendedScalars; | |||
| import graphql.schema.GraphQLSchema; | |||
| import graphql.schema.idl.RuntimeWiring; | |||
| import graphql.validation.ValidationError; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.context.annotation.Bean; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.context.annotation.Import; | |||
| import graphql.execution.instrumentation.Instrumentation; | |||
| import java.util.List; | |||
| /** | |||
| * @author yk | |||
| * @description | |||
| * @date 2024-01-04 22:03 | |||
| */ | |||
| @Configuration | |||
| @Import(GraphQLJavaToolsAutoConfiguration.class) | |||
| public class GraphQLConfig { | |||
| @Bean | |||
| public GraphQL graphQL(List<GraphQLResolver<?>> resolvers, List<SchemaParser> schemaParsers, GraphQLSchema graphQLSchema) { | |||
| return GraphQL.newGraphQL(graphQLSchema) | |||
| .instrumentation(new SimpleAuthInstrumentation()) | |||
| .build(); | |||
| } | |||
| private static class SimpleAuthInstrumentation implements Instrumentation { | |||
| Logger logger = LoggerFactory.getLogger(SimpleAuthInstrumentation.class); | |||
| @Override | |||
| public InstrumentationContext<ExecutionResult> beginExecution(InstrumentationExecutionParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<Document> beginParse(InstrumentationExecutionParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<List<ValidationError>> beginValidation(InstrumentationValidationParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<ExecutionResult> beginExecuteOperation(InstrumentationExecuteOperationParameters parameters) { | |||
| GraphQLContext context = parameters.getExecutionContext().getGraphQLContext(); | |||
| // 从上下文中获取请求头中的token | |||
| String token = context.get("Authorization"); | |||
| logger.error("token: {}", token); | |||
| return null; | |||
| } | |||
| @Override | |||
| public ExecutionStrategyInstrumentationContext beginExecutionStrategy(InstrumentationExecutionStrategyParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<ExecutionResult> beginField(InstrumentationFieldParameters parameters) { | |||
| return null; | |||
| } | |||
| @Override | |||
| public InstrumentationContext<Object> beginFieldFetch(InstrumentationFieldFetchParameters parameters) { | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,13 +0,0 @@ | |||
| schema { | |||
| query: Query | |||
| mutation: Mutation | |||
| } | |||
| type Query{ | |||
| } | |||
| type Mutation{ | |||
| } | |||
| @@ -1,4 +0,0 @@ | |||
| type R{ | |||
| code: Int! | |||
| msg: String | |||
| } | |||
| @@ -0,0 +1,12 @@ | |||
| scalar Long | |||
| scalar DateTime | |||
| type Query { | |||
| selectOne(id: Long): DmVisitorsDto | |||
| list: [DmVisitorsDto] | |||
| # queryVisitList: [DmVisitRecordsDto] | |||
| } | |||
| type Mutation { | |||
| update(id: Long, phone: String, name: String, nickName: String): Boolean | |||
| delete(id: Long): Boolean | |||
| } | |||
| @@ -0,0 +1,11 @@ | |||
| type DmVisitRecordsDto { | |||
| id: String | |||
| visitorId: Long | |||
| userId: Long | |||
| receiverName: String | |||
| receiverPhone: String | |||
| recordStatus: Int | |||
| visitDate: DateTime | |||
| visitorCode: String | |||
| } | |||
| @@ -1,3 +0,0 @@ | |||
| extend type Query{ | |||
| getVisitorList() | |||
| } | |||
| @@ -0,0 +1,11 @@ | |||
| type DmVisitorsDto { | |||
| id: String | |||
| age: String | |||
| name: String | |||
| phone: String | |||
| type: Int | |||
| visitorCompany: String | |||
| avatar: String | |||
| } | |||