Skip to content

Cross-Cutting Issues Analysis

本文档汇总 15 个领域深入分析文档中发现的跨领域问题,识别重复模式、冲突、依赖关系,并提供优先级排序的问题矩阵。


1. Security Vulnerabilities Summary

1.1 Critical Security Issues(跨领域安全漏洞汇总)

#严重级别类别问题描述位置来源域
S-01CRITICALSQL InjectionSiteController 直接拼接用户输入到 SQL 条件SiteController.java:168#04 Attendee
S-02CRITICALSQL InjectionFileService 文件名搜索直接拼接字符串到 SQLFileService.java:42#13 Content
S-03CRITICALSQL InjectionExpenseMapper.xml 使用 ${direction} 而非 #{direction}ExpenseMapper.xml:118-125#15 Expense
S-04CRITICALSQL InjectionSalesforce SOQL 查询拼接无参数化SfdcFacade.java:203, DefaultAccountService.java:169-185#09 Integration
S-05CRITICALRCECustom Reports 通过 ProcessBuilder 执行文件系统上的 R/Python 脚本ProductCustomReportService.java:314-324#10 Reporting
S-06CRITICALData Exposure公共 API 泄露 SendGrid API Key、SFTP 密码、Google API KeyPublicConfigurationController.java:30-43#11 Config
S-07CRITICALData ExposureData Extract 使用 PGConnection 直接执行 SQL,无用户权限过滤ProductCustomReportService.java:348-394#10 Reporting
S-08CRITICALAuth BypassSSO Cookie 缺少 HttpOnly/Secure 标志CustomAuthenticationSuccessHandler.java:161-162#07 User
S-09CRITICALAuth BypassLegacy 密码明文比对仍然活跃UserPasswordAuthenticationProvider.java:66-67#07 User
S-10CRITICALAuth BypassExternal-Authorization JWT 无 claim 验证(audience/expiry),签名有效即获 SYSTEM 权限AuthInfoPreAuthFilter.java:78-99#07 User
S-11HIGHMITMSFTP 禁用主机密钥验证 (PromiscuousVerifier)SFTPService.java:140#09 Integration
S-12HIGHCredential Exposure所有集成凭据明文存储在 YAML 配置文件中全部集成模块#09 Integration
S-13HIGHCredential ExposureZoom OAuth secrets 直接存储在 YAML 中VirtualProgramConfig.java#11 Config
S-14HIGHXSSSpeakerview 使用 dangerouslySetInnerHTMLApp/index.js:215#03 Speaker
S-15HIGHUnauth Access/v1/public/document-url 通过 attendeeId 即可下载 PDF,无鉴权PublicDocumentURLController.java:15#13 Content
S-16HIGHUnauth AccessDocXManagementController 直接列出服务器文件系统目录DocXManagementController.java:39-43#13 Content
S-17MEDIUMWeak RNGZoom 密码使用 Random 而非 SecureRandomZoomAbstractService#16 Virtual
S-18MEDIUMHashMD5 用于文件哈希(应使用 SHA-256)FileService.java:65#13 Content

1.2 Authentication & Authorization Gaps(认证授权缺口)

缺失权限控制的 Controller 汇总:

Controller端点数量问题来源域
UserController18全部端点无权限控制,任何登录用户可 CRUD 任何用户#07 User
RoleController~10角色/权限管理无权限控制#07 User
ComplianceController~10合规配置无权限控制#06 Compliance
GeographyController18地理结构管理无权限控制#12 Geographic
SalesForceController6SalesForce 管理无权限控制#12 Geographic
TeamController5Team 管理无权限控制#12 Geographic
ContentController19内容管理无权限控制#13 Content
FileController~5文件管理无权限控制#13 Content

Token/Session 问题:

  • Token 使用内存 Guava Cache(非 JWT),不支持水平扩展 (AuthManager.java:27-28) → #07
  • SSO Token 不删除,t_user_auth_token 表无限增长 (UserTokenAuthenticationProvider.java:47-51) → #07
  • 密码重置 Token 使用 JVM 内存 Guava Cache,重启丢失 (SpeakerService.java:133-137) → #03
  • 密码重置 Token 使用 JVM 内存 Cache (UserService.java:151-154) → #07
  • 权限信息缓存不随修改更新 (AuthInfoUserDetailsService.java) → #07

2. Architectural Anti-Patterns

2.1 God Classes(超大类汇总)

文件行数职责来源域
AttendeeService.java2,100+注册、reconciliation、导入、签到、TOV 等#04 Attendee
ProgramService.java1,577创建、审批、状态变更、列表查询、合规#02 Program
ProductReportService.java1,43029 种标准报表 + 权限过滤#10 Reporting
UserService.java1,109用户 CRUD、密码、角色、限制检查#07 User
CommunicationService.java964邮件发送、模板解析、变量替换#08 Communication
DocumentTemplateService.java954文档上下文组装、格式转换、文件 IO#13 Content
ContentService.java993内容管理、幻灯片编辑、演示文稿生成#03 Speaker
MeetingService.java967Meeting CRUD、分配、下载、共享#02 Program
SpeakerService.java980Speaker CRUD、搜索、认证、密码重置#03 Speaker
BudgetAllocationService.java824预算分配、策略模式、成本计算#05 Budget
ComplianceService.java640合规文档、Agg Spend、导出#06 Compliance
GeographyService.java600+地理 CRUD、重分配、Planner 分配#12 Geographic

2.2 Naming Inconsistencies(命名混乱汇总)

混乱对问题描述影响范围
Meeting vs MeetingRequest vs ProgramMeetingRequest = 业务 "Program",Meeting = "Registration Site",但模块名为 meeting,Controller 分 meetingsprograms全局核心概念
SalesTeam vs SalesForceDB 表 t_sales_team,视图 v_sales_force 重命名。Entity 同时有 salesTeamIdsalesForceId,需手动同步#12 Geographic
FiscalYear vs FiscalPeriodDTO 和 Entity 中两个名字混用,指同一概念#05 Budget
deleted vs del_flag vs status软删除字段命名不一致全局(见 2.3)
ProductConfiguration两个完全不同的类同名:DB Entity (3 fields) vs YAML POJO (100+ fields)#11 Config
speakerName vs speakernameSpeaker 实体中大小写不一致的重复字段#03 Speaker
enable vs disable**Feature flag 命名正反混用#11 Config

2.3 Data Model Anti-Patterns

Missing @Id / Primary Key:

Entity问题来源域
MeetingChangeLog无 @Id 注解#02 Program
FiscalYear无主键#05 Budget
AttendeeSurveyResponse缺少主键#14 Survey
UserProductRole缺少主键#07 User
SiteTemplateattendee_type_id 作为主键,缺少 meeting_id#13 Content

软删除不一致:

Entity字段模式来源域
AttendeedeletedBoolean#04
Contentdel_flagInteger#13
DocumentdeletedInteger#13
BudgetItemdeletedString ("ACTIVE"/"INACTIVE")#05
BrandstatusInteger (0/1)#11
Speaker硬删除(无软删除字段)N/A#03
Expense硬删除N/A#15

JSONB 滥用(无类型 Object 字段):

Entity字段来源域
MeetingRequestapprovals, dynamicProgramFields, virtualProgramInfo, zoomProgramInfo, speakerRandomization#02
MeetingComplianceDocumentfiles#06
ComplianceDocumentconfig#06
Mailconfig#08
ScheduledEmailconfig#08
EmailSandboxconfig#08
AttendeeSurveycontent (问卷模板)#14
ProductproductConfig#11
ProductConfigurationlogos#11
UserCompanyproductIds#07
AttendeevirtualProgramAttendeeInfo, registrationSource#04, #16

自定义序列化格式:

格式用途位置来源域
@-@ / @=@ 分隔符meetingRequestInfo KV 存储MeetingRequestDTO.java#02
分号分隔字符串mailTo 多收件人Mail.java:65#08
分号分隔字符串attendeeId 列表CommunicationService#08
逗号分隔字符串contract IDs 下载SpeakerContractController.java:117#03

2.4 Hardcoded Values(硬编码汇总)

客户特定逻辑:

硬编码值用途位置来源域
productId == 24 (Tesaro)特殊字段处理MeetingRequestDTO.java#02
productId == 24待审批提醒仅此客户可用MeetingTask.java:54#08
"Noven Therapeutics, LLC"Porzio 报告格式PorzioAggSpendReport.java:19,25,28,42,74#06
Noven 参会者字段映射报表列ProductReportService.java:429-436#10
FOOD_BEVERAGE_SUB_CATEGORY = 15923TOV 计算AttendeeTovService.java:75-78#06
categoryId 9/4预算类型(Honoraria/Speaker Expense)BudgetItemTemplateService.java:168-169,184#05
countryId = 2 (US)Program 创建默认值CreateProgramRequest.java#02

过期时间硬编码:

硬编码值过期时间位置来源域
DST 时间表 2017-20302031年失效MailService.java:639-658#08
FiscalPeriod 年份到 20252026年已失效FiscalPeriod.java:11-22#11
"2024 Noven SP Attendees"已过期NovenAttendanceFrequencyCheckService.java:98#04

3. Cross-Domain Dependencies

3.1 Dependency Map

                    ┌──────────────┐
                    │ Configuration│
                    │   (#11)      │
                    └──────┬───────┘
                           │ feature flags / product config
              ┌────────────┼────────────────┐
              ▼            ▼                ▼
     ┌────────────┐ ┌──────────┐    ┌──────────────┐
     │   User &   │ │Geographic│    │Communication │
     │ Permission │ │ (#12)    │    │   (#08)      │
     │   (#07)    │ └────┬─────┘    └──────┬───────┘
     └─────┬──────┘      │                │
           │             │                │ emails/alerts
           │ auth        │ territory      │
           ▼             ▼                ▼
     ┌─────────────────────────────────────────┐
     │          Program & Meeting (#02)         │
     │  (Central Hub - most dependencies)       │
     └──┬────────┬────────┬────────┬───────┬───┘
        │        │        │        │       │
        ▼        ▼        ▼        ▼       ▼
  ┌─────────┐ ┌──────┐ ┌──────┐ ┌─────┐ ┌──────────┐
  │ Speaker │ │Budget│ │Attend│ │Comp-│ │ Virtual  │
  │  (#03)  │ │(#05) │ │-ee   │ │lian-│ │ Program  │
  └────┬────┘ └──────┘ │(#04) │ │ce   │ │  (#16)   │
       │               └──┬───┘ │(#06)│ └──────────┘
       │                  │     └──┬──┘
       ▼                  ▼        │
  ┌─────────┐      ┌──────────┐   │
  │ Content │      │  Survey  │   │
  │  (#13)  │      │  (#14)   │   │
  └─────────┘      └──────────┘   │

  ┌─────────┐      ┌──────────┐   │
  │ Expense │      │Reporting │◄──┘ (compliance reports)
  │  (#15)  │      │  (#10)   │
  └─────────┘      └──────────┘

  ┌──────────────┐
  │ Integration  │←── connects to: Salesforce, Zoom, SendGrid, SSO, SFTP
  │   (#09)      │
  └──────────────┘

3.2 Shared Entity Analysis(跨域共享实体)

Entity主域使用域冲突说明
MeetingRequest#02 Program#03 Speaker, #04 Attendee, #05 Budget, #06 Compliance, #08 Comm, #10 Report, #16 Virtual98 字段的"上帝实体",所有域都直接读写
Attendee#04 Attendee#06 Compliance (TOV), #10 Report, #14 Survey40 字段,被合规和报表直接查询
Speaker#03 Speaker#02 Program (speaker slots), #05 Budget (honoraria), #10 Report88 字段,预算和报表直接引用
Product#11 Config几乎所有域产品 ID 作为全局上下文,所有业务查询都需要
UnifiedUser#07 User几乎所有域用户身份贯穿所有操作
Mail#08 Comm#08 (邮件发送 + 邀请模板)同一张表双重职责

3.3 Coupling Issues(耦合问题)

Service 层循环依赖:

  • MeetingServiceProgramService 互相注入 (#02)
  • ProgramController 直接调用 ComplianceService (#02 → #06)
  • 合规功能分散在 ComplianceController, ProgramController, AttendeeTovController, ProductReportController 四个 Controller (#06)

过度注入(10+ @Autowired 依赖的 Service):

  • MeetingService - 20+ 依赖 (#02)
  • ProgramService - 15+ 依赖 (#02)
  • AttendeeService - 15+ 依赖 (#04)
  • CommunicationService - 10+ 依赖 (#08)

4. Duplicated Logic

4.1 Code Duplication Patterns

重复模式重复次数位置来源域
权限过滤 (Product/Region/District)8+ 次ProductReportService.java#10
PLID enrichment 逻辑2 次ComplianceService.java export() + getMeetingToVData()#06
Reconciliation 实现3 套NPI + Target + Salesforce,各自独立#04
频率检查2 套Noven 特殊实现 + Plus 通用实现#04
登录组件3 套三个前端各自实现 Login 组件#07
路由配置重复 200 行plannerview meetings/:id vs registrations/:id#02
BudgetItem vs BudgetItemTemplate大量重复字段Entity 层#05
Zoom Meeting vs Webinar Service大量代码重复ZoomVirtualMeetingService vs ZoomWebinarService#09
Saga worker 模板代码28 个salesview Reports redux#10

4.2 Dual/Redundant Systems

冗余系统系统 A系统 B说明来源域
Controller 双入口MeetingControllerProgramController同一数据(MeetingRequest),不同视角,职责重叠#02
注册双入口site 模块registration 模块重叠的注册端点,最终调用同一个 AttendeeService.saveRegistration()#04
合同 Controller 双入口SpeakerContractControllerSecureSpeakerContractController同一 Contract 资源,不同安全模型#03
Alert 五系统AlertCustomAlert + MeetingAlert + BudgetAlert + BudgetAlertViewHistory无统一告警模型#08
SSO 双服务pharmagin-ssopharmagin-login新旧并存,login 未上线#07, #09
报表四系统StandardAd-hoc + Custom R/Python + Data Extract无统一报表框架#10
Survey 双系统Backend 动态模板Speakerview 硬编码 fields.js不兼容#14
配置三来源YAMLDB t_product.product_config JSONBDB t_product_configuration#11

5. Infrastructure Issues

5.1 Scalability Blockers(可扩展性阻断点)

阻断点问题位置来源域
In-memory token storageGuava Cache 存 auth token,重启丢失AuthManager.java:27-28#07
In-memory password resetGuava Cache 存重置 tokenSpeakerService.java:133-137, UserService.java:151-154#03, #07
Local filesystem storage文件存本地磁盘FileService.java, TemplateService.java#13
Thread-unsafe singletonsFieldMappingFactory 静态单例共享可变状态FieldMappingFactory.java:40-41,56-63#09
Thread-unsafe singletonsSfdcFacade 单例共享 PartnerConnectionSfdcFacade.java:36-37,52#09
Thread-unsafe singletonsZoomAccessTokenManager 全局静态缓存ZoomAccessTokenManager.java:12#09, #16
Thread-unsafe singletonsStrategy 单例共享 comment 字段RegionToDistrictStrategy.java:23, DistrictToDistrictStrategy.java:21#05
SimpleDateFormat 共享多处作为实例变量使用SendGridService.java:41, MosaicService.java:29#09
裸 Thread 使用文档生成使用 new Thread()DocumentTemplateService.java:315,351#13

5.2 Configuration Chaos(配置混乱)

  • 三重配置来源无优先级:YAML(AgencyConfiguration)、DB JSONB(product_config)、DB 表(t_product_configuration)优先级未定义 (#11)
  • 165+ Feature Flags 全部需重启:所有 flag 嵌入 YAML,无运行时切换能力 (#11)
  • 正反命名混用enable*disable* 混用,前端逻辑易出错 (#11)
  • 配置层级重叠speakerLevels 同时出现在 CompanyConfiguration 和 ProductConfiguration (#11)

5.3 Missing Infrastructure(缺失基础设施)

缺失组件影响当前替代方案
消息队列邮件发送无重试、事件驱动不完整@Async + 直接调用
分布式缓存Token/Session 不支持多实例JVM 内存 Guava Cache
API 网关无统一认证、限流、路由Nginx + 各服务独立认证
断路器外部集成无容错(Salesforce/Zoom/SendGrid)直接调用无重试(仅 Podio 有 Spring Retry)
集中式日志分散在各服务日志文件log.error() + printStackTrace() 混用
配置中心(运行时)功能开关需重启Spring Cloud Config(启动时加载,不可热更新)
对象存储文件存本地磁盘服务器文件系统
任务调度平台定时任务分散在各服务Spring @Scheduled 注解

6. Frontend Cross-Cutting Issues

6.1 Technology Debt

技术当前版本目标版本影响的前端
React15.x-16.x18.x+plannerview, speakerview
React Router3.x-4.x6.x+plannerview, speakerview
Ant Design3.x5.x+plannerview, speakerview
ReduxClass-basedRedux Toolkit / Zustand全部
Build ToolCRACOVite全部
Dynamic ImportSystem.importimport()speakerview
Lifecycle MethodscomponentWillReceiveProps (deprecated)Hooks全部
String Refsref="xxx"useRef / createRefplannerview Ad-hoc Report

6.2 Shared Code Gaps

缺失组件现状影响
共享组件库三个前端独立开发相同组件3x 代码量
共享 API 客户端各自实现 fetch/axios 调用错误处理不一致
共享 Auth 模块三个 Login 组件各自实现登录行为不一致
共享类型定义无 TypeScript165+ feature flags 无类型检查
共享状态管理Redux / sessionStorage / props 混用数据不同步

6.3 State Management Issues

  • sessionStorage 不跨标签页:用户体验差,不同标签页状态不同步 (#07)
  • 前端硬编码角色检查:Speakerview 使用简单字符串角色 ('Admin', 'Speaker', 'Sales') 忽略后端 RBAC (#07)
  • 配置双重存储:Redux 和 sessionStorage 中双重存储配置 (#11)
  • Saga 模板代码大量重复:28 个 saga workers 可用通用工厂简化 (#10)
  • 前端包含大量业务逻辑:TOV 计算、权限过滤等应在后端处理

7. Data Integrity Risks

7.1 Missing Transactions(缺失事务控制)

操作风险位置来源域
地理重分配 (District/Territory)多步骤 DB 更新无 @TransactionalGeographyService.java reassign 方法#12
Attendee Response 保存先删后插无事务,并发可能数据丢失AttendeeService.java:725-746#04
Aggregate Spend 配置保存DELETE ALL + INSERT ONE-BY-ONEComplianceService.java:322-337#06
预算分配多步骤分配无事务保护BudgetAllocationService.java#05

7.2 Cascade Delete Risks(级联删除风险)

操作问题位置来源域
Speaker 删除硬删除,无法恢复SpeakerService.java:503#03
Expense 删除物理删除ExpenseService#15
MeetingAlert 删除空 Example 删除所有记录MeetingController.java:153-156#02
BudgetItem 删除设 deleted=INACTIVE 后立即物理删除BudgetItemService.java:143-144#05

7.3 Orphan Data Risks

  • t_user_auth_token 无过期清理机制,无限增长 (#07)
  • 临时文件(DOCX、PNG)异常时不清理 (#13)
  • BudgetAllocationHistory 和 ExpenseHistory 累积完整记录副本 (#05, #15)

8. Prioritized Issue Matrix

8.1 P0 - Must Fix Before/During Rewrite(必须修复)

#问题类别来源域影响
P0-01SQL Injection (4处)Security#04, #13, #15, #09数据泄露/破坏
P0-02RCE via ProcessBuilderSecurity#10服务器完全控制
P0-03公共 API 泄露 API Keys/密码Security#11凭据泄露
P0-04Data Extract 无权限过滤Security#10数据泄露
P0-05SSO Cookie 无 HttpOnly/SecureSecurity#07Session 劫持
P0-06JWT 无 claim 验证Security#07身份伪造
P0-07多个 Controller 无权限控制Security#07, #06, #12, #13未授权操作
P0-08明文密码比对Security#07密码泄露
P0-09In-memory token 阻止水平扩展Architecture#07不可扩展
P0-10MeetingRequest 98字段上帝实体Architecture#02核心数据模型不可维护
P0-11AttendeeService 2100+ 行 God ClassArchitecture#04核心逻辑不可维护
P0-12Meeting vs MeetingRequest 命名混淆Architecture#02开发效率极低
P0-13FiscalPeriod 硬编码到 2025Bug#11功能已失效
P0-14assignPlannerToSalesforce 逻辑反转Bug#12功能完全失效
P0-15NPI/Target 过滤条件 BugBug#04Reconciliation 静默失败

8.2 P1 - Fix During Rewrite(重写时修复)

#问题类别来源域
P1-01三重配置来源无优先级Architecture#11
P1-02165+ Feature Flags 需重启Architecture#11
P1-03Alert 五系统碎片化Architecture#08
P1-04报表四系统碎片化Architecture#10
P1-05SSO 双服务并存Architecture#07, #09
P1-06Controller 双入口 (meetings + programs)Architecture#02
P1-07注册双入口 (site + registration)Architecture#04
P1-08Speaker 88 字段单表Data Model#03
P1-09合同报酬 15+ 硬编码字段Data Model#03
P1-10JSONB 字段无类型安全 (10+ 处)Data Model多域
P1-11软删除模式不统一Data Model全局
P1-12自定义序列化格式 (@-@, 分号等)Data Model#02, #08
P1-13审批逻辑 200+ 行 if/elseBusiness Logic#02
P1-14三套独立 Reconciliation 实现Business Logic#04
P1-15Reconciliation 逻辑散在多个 ServiceBusiness Logic#04
P1-16权限过滤逻辑重复 8+ 次Code Quality#10
P1-17本地文件系统存储Infrastructure#13
P1-18Thread-unsafe 单例 (4处)Concurrency#05, #09
P1-19所有凭据明文存储Security#09
P1-20SFTP 禁用主机密钥验证Security#09

8.3 P2 - Nice to Have(改善项)

#问题类别来源域
P2-01Lombok 使用不统一Code Style全局
P2-02React 版本过旧 (15.x-16.x)Frontend全局
P2-03无共享前端组件库Frontend全局
P2-04无 TypeScript 类型Frontend全局
P2-05Deprecated React 生命周期方法Frontend全局
P2-06Saga 模板代码大量重复Frontend#10
P2-07Swagger 注解不完整/错误API Docs多域
P2-08一次性迁移 Controller 未移除Cleanup#05, #14
P2-09已移除功能的遗留字段Cleanup#03, #04, #15
P2-10拼写错误 (trainnedDate, parmaeters, deactive, MTBudgetSeachForm)Code Quality多域

9. Statistics Summary

9.1 Issue Counts by Domain

DomainCriticalDesignTech DebtTotal
#02 Program & Meeting68822
#03 Speaker9101029
#04 Attendee & Registration691025
#05 Budget & Financial6101026
#06 Compliance510823
#07 User & Permission8101028
#08 Communication68721
#09 Integration7111028
#10 Reporting58821
#11 Configuration58821
#12 Geographic58720
#13 Content & Document7101027
#14 Survey35513
#15 Expense45514
#16 Virtual Program36514
Total85126121332

9.2 Issue Counts by Category

类别数量占比
Security (安全漏洞)185.4%
Architecture (架构问题)4513.6%
Data Model (数据模型)5215.7%
Business Logic (业务逻辑)3811.4%
API Design (API 设计)3510.5%
Code Quality (代码质量)4814.5%
Frontend (前端)5516.6%
Infrastructure (基础设施)154.5%
Concurrency (并发)82.4%
Other185.4%
Total332100%