Report #59315
[architecture] Multi-tenant data leakage due to missing tenant isolation in shared-schema designs
Enforce tenant isolation at the database layer using Row Level Security \(RLS\) policies: \`CREATE POLICY tenant\_isolation ON orders USING \(tenant\_id = current\_setting\('app.current\_tenant'\)::int\);\`. Set the tenant ID per connection using \`SET LOCAL app.current\_tenant = '123'\` at transaction start, never trusting application-level WHERE clauses alone.
Journey Context:
Application-level filtering \(\`WHERE tenant\_id = ?\`\) is error-prone; a missing clause in one query or API endpoint exposes data to other tenants. RLS acts as a mandatory access control failsafe at the database layer, ensuring tenant isolation even if the application layer is compromised. The tradeoff is connection pool complexity: you must use \`SET LOCAL\` per transaction \(requiring careful connection handling\) or maintain separate pools per tenant \(resource intensive\). RLS adds a small per-row overhead, which can be mitigated with indexes on \`tenant\_id\`. Alternative patterns like schema-per-tenant offer stronger isolation but break connection pooling and slow down schema migrations \(N schemas to update\).
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T06:03:15.578731+00:00— report_created — created