diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java index 814066ce1..c902a41b8 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/tenant/TenantContextHolderFilter.java @@ -17,20 +17,30 @@ package com.pig4cloud.pigx.common.data.tenant; +import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; +import com.pig4cloud.pigx.admin.api.entity.SysTenant; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.GenericFilterBean; - import jakarta.servlet.FilterChain; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.interceptor.SimpleKey; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.GenericFilterBean; + +import java.util.List; +import java.util.Objects; /** * @author lengleng @@ -38,34 +48,71 @@ import jakarta.servlet.http.HttpServletResponse; */ @Slf4j @Component +@RequiredArgsConstructor @Order(Ordered.HIGHEST_PRECEDENCE) public class TenantContextHolderFilter extends GenericFilterBean { - private final static String UNDEFINED_STR = "undefined"; + private final static String UNDEFINED_STR = "undefined"; - @Override - @SneakyThrows - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { - HttpServletRequest request = (HttpServletRequest) servletRequest; - HttpServletResponse response = (HttpServletResponse) servletResponse; + private final CacheManager cacheManager; - String headerTenantId = request.getHeader(CommonConstants.TENANT_ID); - String paramTenantId = request.getParameter(CommonConstants.TENANT_ID); + @Override + @SneakyThrows + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) { + HttpServletRequest request = (HttpServletRequest) servletRequest; + HttpServletResponse response = (HttpServletResponse) servletResponse; - log.debug("获取header中的租户ID为:{}", headerTenantId); + String headerTenantId = request.getHeader(CommonConstants.TENANT_ID); + String paramTenantId = request.getParameter(CommonConstants.TENANT_ID); - if (StrUtil.isNotBlank(headerTenantId) && !StrUtil.equals(UNDEFINED_STR, headerTenantId)) { - TenantContextHolder.setTenantId(Long.parseLong(headerTenantId)); - } - else if (StrUtil.isNotBlank(paramTenantId) && !StrUtil.equals(UNDEFINED_STR, paramTenantId)) { - TenantContextHolder.setTenantId(Long.parseLong(paramTenantId)); - } - else { - TenantContextHolder.setTenantId(CommonConstants.TENANT_ID_1); - } + log.debug("获取header中的租户ID为:{}", headerTenantId); - filterChain.doFilter(request, response); - TenantContextHolder.clear(); - } + if (StrUtil.isNotBlank(headerTenantId) && !StrUtil.equals(UNDEFINED_STR, headerTenantId)) { + TenantContextHolder.setTenantId(Long.parseLong(headerTenantId)); + } else if (StrUtil.isNotBlank(paramTenantId) && !StrUtil.equals(UNDEFINED_STR, paramTenantId)) { + TenantContextHolder.setTenantId(Long.parseLong(paramTenantId)); + } else { + TenantContextHolder.setTenantId(CommonConstants.TENANT_ID_1); + } + + if (!checkTenantStatus(request, response)) return; + + filterChain.doFilter(request, response); + TenantContextHolder.clear(); + } + + /** + * 检查租户状态 + * + * @param request 请求 + * @param response 响应 + * @return boolean + */ + private boolean checkTenantStatus(HttpServletRequest request, HttpServletResponse response) { + // 如果是获取租户列表请求跳过 + if (StrUtil.containsAnyIgnoreCase(request.getRequestURI(), "/tenant/list")) { + return true; + } + + // 判断租户状态 + Cache cache = cacheManager.getCache(CacheConstants.TENANT_DETAILS); + if (cache == null) { + return true; + } + + Cache.ValueWrapper valueWrapper = cache.get(SimpleKey.EMPTY); + if (Objects.isNull(valueWrapper)) { + return true; + } + + List tenantList = (List) valueWrapper.get(); + boolean exist = tenantList.stream().anyMatch(tenant -> NumberUtil.equals(tenant.getId(), TenantContextHolder.getTenantId())); + if (exist) { + return true; + } + + response.setStatus(HttpStatus.UPGRADE_REQUIRED.value()); + return false; + } }