package com.dsh.guns.modular.system.audit; import com.dsh.guns.config.UserExt; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** Spring 会把该 RequestInterceptor 应用于管理端全部 Feign 客户端。 */ @Component public class ManagementFeignAuditInterceptor implements RequestInterceptor { @Resource private ManagementAuditWriter auditWriter; @Override public void apply(RequestTemplate template) { try { Map audit = new HashMap(); String url = template.url(); if (url != null && url.startsWith("/internal/sensitive/") && UserExt.getUser() != null && "admin".equalsIgnoreCase(UserExt.getUser().getAccount())) { template.header("X-Internal-Sensitive-Access", "true"); } audit.put("traceId", UUID.randomUUID().toString().replace("-", "")); audit.put("sourceService", "mb-cloud-management"); audit.put("sourceType", "FEIGN"); audit.put("operationType", "FEIGN_CALL"); audit.put("riskLevel", riskLevel(url)); audit.put("operationName", template.feignTarget() == null ? "Feign调用" : template.feignTarget().name()); audit.put("requestMethod", template.method()); audit.put("requestUri", url); audit.put("requestParams", template.body() == null ? null : "bodyBytes=" + template.body().length); audit.put("userId", UserExt.getUser() == null ? null : UserExt.getUser().getId()); audit.put("userAccount", UserExt.getUser() == null ? null : mask(UserExt.getUser().getAccount())); audit.put("result", "REQUESTED"); audit.put("createdAt", new Date()); auditWriter.append(audit); } catch (Exception ignored) { // 审计异常绝不能阻塞原 Feign 调用。 } } private String riskLevel(String url) { String value = url == null ? "" : url.toLowerCase(); return value.matches(".*(ticket|payment|finance|refund|withdraw|balance|status|state).*") ? "CRITICAL" : "NORMAL"; } private String mask(String value) { if (StringUtils.isEmpty(value)) return null; return value.length() <= 4 ? "***" : value.substring(0, 3) + "***" + value.substring(value.length() - 2); } }