From 928cb4a26af3d3a0ca42ed9e03bffcc40ccd6d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E9=B9=8F?= <812968653@qq.com> Date: Fri, 21 Aug 2026 20:07:44 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/MemberUserDisableInterceptor.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/core/MemberUserDisableInterceptor.java diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/core/MemberUserDisableInterceptor.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/core/MemberUserDisableInterceptor.java new file mode 100644 index 0000000..0958325 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/framework/web/core/MemberUserDisableInterceptor.java @@ -0,0 +1,74 @@ +package cn.iocoder.yudao.module.member.framework.web.core; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.framework.web.config.WebProperties; +import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.service.user.MemberUserService; +import cn.iocoder.yudao.module.system.api.oauth2.OAuth2TokenApi; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.member.enums.MemberErrorCode.AUTH_LOGIN_USER_DISABLED; + +/** + * App 端已登录请求统一校验会员是否禁用。 + *

+ * 与 {@code GET /member/user/get} 行为一致:禁用则清 token 并返回 + * {@link cn.iocoder.yudao.module.member.enums.MemberErrorCode#AUTH_LOGIN_USER_DISABLED}, + * 供 Flutter ApiClient 全局踢登录。 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class MemberUserDisableInterceptor implements HandlerInterceptor { + + private final WebProperties webProperties; + private final MemberUserService memberUserService; + private final OAuth2TokenApi oauth2TokenApi; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { + String uri = request.getRequestURI(); + String contextPath = request.getContextPath(); + String path = contextPath == null || contextPath.isEmpty() + ? uri + : uri.substring(contextPath.length()); + // 仅 App API + if (!path.startsWith(webProperties.getAppApi().getPrefix())) { + return true; + } + + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + if (loginUser == null || loginUser.getId() == null) { + return true; + } + // 仅会员 + if (!UserTypeEnum.MEMBER.getValue().equals(loginUser.getUserType())) { + return true; + } + + MemberUserDO user = memberUserService.getUser(loginUser.getId()); + if (user == null || CommonStatusEnum.isDisable(user.getStatus())) { + if (user != null) { + try { + oauth2TokenApi.removeAccessTokenByUserId( + user.getId(), UserTypeEnum.MEMBER.getValue()); + } catch (Exception e) { + log.warn("禁用用户请求时清 token 失败, userId={}", user.getId(), e); + } + } + throw exception(AUTH_LOGIN_USER_DISABLED); + } + return true; + } + +}