feat(租户管理): 状态过期,强制退出对应租户所有操作

This commit is contained in:
冷冷 committed 2024-08-16 15:28:13 +08:00
1 parent d5daf6b27d
commit 5827c163c2
1 file changed
+75 -28
@@ -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<SysTenant> tenantList = (List<SysTenant>) 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;
}
}