From f06f9820215e2cfad4ca034abc09b241071b0a04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= <2270033969@qq.com> Date: Sun, 11 Aug 2024 15:54:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=A7=9F=E6=88=B7=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E8=BF=87=E6=9C=9F=EF=BC=8C=E5=BC=BA=E5=88=B6?= =?UTF-8?q?=E9=80=80=E5=87=BA=E5=AF=B9=E5=BA=94=E7=A7=9F=E6=88=B7=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tenant/TenantContextHolderFilter.java | 89 ++++++++++++++----- 1 file changed, 68 insertions(+), 21 deletions(-) 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 3655c38cd..67c0f2ebb 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,12 +17,20 @@ 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.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; @@ -31,6 +39,8 @@ import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Objects; /** * @author lengleng @@ -38,34 +48,71 @@ import javax.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; + } }