mirror of
http://git.pig4cloud.com/pig/pigx.git
synced 2026-11-08 12:39:05 +08:00
feat(租户管理): 状态过期,强制退出对应租户所有操作
This commit is contained in:
1 parent
3ed430a92e
commit
f06f982021
1 file changed
+68
-21
+68
-21
@@ -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<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;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user