Context
Problem Statement:
The multi-tenant HDIM platform had critical tenant isolation vulnerabilities:
TenantAccessFilter.java was disabled (renamed to .disabled)CqlSecurityCustomizer.java allowed ALL requests without authenticationBusiness Context:
Technical Context:
X-Tenant-ID headerDecision
We will re-enable and enforce tenant isolation through a security filter that validates user access to requested tenants.
Specific Implementation:
X-Tenant-ID against user's authorized tenantsFilter Chain Order:
Request → RateLimitFilter → JwtAuthenticationFilter → TenantAccessFilter → Controller
Alternatives Considered
Alternative 1: Database-Level Row Security (RLS)
Description: Implement PostgreSQL Row-Level Security policies
Pros:
Cons:
Why Not Chosen: Application-level filter provides clearer audit trail; RLS can be added later as defense-in-depth
Alternative 2: Separate Databases Per Tenant
Description: Each tenant gets isolated database
Pros:
Cons:
Why Not Chosen: Current architecture uses shared database; would require major refactor
Alternative 3: API Gateway-Only Enforcement
Description: Validate tenant access only at gateway
Pros:
Cons:
Why Not Chosen: Services should be self-protecting; gateway is additional layer
Consequences
Positive Consequences
Negative Consequences
Mitigation
Compliance & Security
Implementation Plan
TenantAccessFilter.javaFiles Modified
backend/modules/shared/infrastructure/authentication/src/main/java/com/healthdata/authentication/security/TenantAccessFilter.javabackend/modules/services/care-gap-service/src/main/java/com/healthdata/caregap/config/CareGapSecurityConfig.javabackend/modules/services/patient-service/src/main/java/com/healthdata/patient/config/PatientSecurityConfig.javabackend/modules/services/quality-measure-service/src/main/java/com/healthdata/quality/config/QualityMeasureSecurityConfig.javabackend/modules/services/fhir-service/src/main/java/com/healthdata/fhir/config/FhirSecurityConfig.javabackend/modules/services/cql-engine-service/src/main/java/com/healthdata/cql/config/CqlSecurityCustomizer.java