All Downloads are FREE. Search and download functionalities are using the official Maven repository.

love.keeping.starter.web.aop.OpenApiAspect Maven / Gradle / Ivy

package love.keeping.starter.web.aop;

import love.keeping.starter.common.exceptions.impl.AccessDeniedException;
import love.keeping.starter.common.utils.ArrayUtil;
import love.keeping.starter.common.utils.CollectionUtil;
import love.keeping.starter.web.annotations.OpenApi;
import love.keeping.starter.web.sign.CheckSignFactory;
import love.keeping.starter.web.sign.CheckSignHandler;
import love.keeping.starter.web.common.utils.ApplicationUtil;
import love.keeping.starter.web.vo.OpenApiReqVo;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * OpenApi切面
 *
 * @author Keeping
 */
@Aspect
public class OpenApiAspect {

  @Pointcut("(@within(org.springframework.web.bind.annotation.RestController) || @within(org.springframework.stereotype.Controller)) && @annotation(love.keeping.starter.web.annotations.OpenApi) && execution(public * *(..))")
  public void openApiPointCut() {

  }

  @Around(value = "openApiPointCut()")
  public Object openApi(ProceedingJoinPoint joinPoint) throws Throwable {

    Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass());

    MethodSignature signature = (MethodSignature) joinPoint.getSignature();

    OpenApi openApi = signature.getMethod().getAnnotation(OpenApi.class);

    Object[] args = joinPoint.getArgs();

    CheckSignFactory checkSignFactory = ApplicationUtil.getBean(CheckSignFactory.class);
    CheckSignHandler checkSignHandler = checkSignFactory.getInstance();

    if (openApi.sign()) {
      if (ArrayUtil.isEmpty(args)) {
        throw new AccessDeniedException("验签失败!");
      }
      List reqList = Arrays.stream(args).filter(t -> t instanceof OpenApiReqVo)
          .map(t -> (OpenApiReqVo) t).collect(Collectors.toList());

      if (CollectionUtil.isEmpty(reqList)) {
        throw new AccessDeniedException("验签失败!");
      }
      for (OpenApiReqVo req : reqList) {
        if (!checkSignHandler.check(req)) {
          throw new AccessDeniedException("验签失败!");
        }

        checkSignHandler.setTenantId(req);
      }
    }

    // 如果openApi.sign() 为false,那么需要接口自己设置TenantId

    Object value = joinPoint.proceed();

    return value;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy