BootSaaS:schema‑per‑tenant 方案防止跨租户数据泄露
正文
在 B2B SaaS 中,单一查询缺失租户过滤即可让用户看到其他客户的账单。
BootSaaS 采用 schema‑per‑tenant 架构:
- 每个租户拥有独立的 PostgreSQL schema(如acme.invoices、globex.invoices)。
- 业务查询保持简洁:SELECT id, amount FROM invoices,连接层根据租户上下文自动切换到对应 schema。
- 通过 Spring Security 解析 JWT 中的 tenantId,填充CurrentTenantIdentifierResolver与MultiTenantConnectionProvider,确保请求在正确的 schema 下执行。
核心优势
- 业务表隔离:不同租户的数据完全分离,避免误读。
- 共享连接池:单一数据库角色与统一 HikariCP 池,资源利用率高。
- 统一迁移:Liquibase 负责所有租户的 schema 变更,迁移脚本可复用。
实现要点
- 租户注册后异步创建 schema,完成迁移才标记为可用。
- 迁移历史与锁表放在各自租户 schema,防止跨租户冲突。
- 通过测试覆盖:租户导出不泄露他人数据、ID 访问隔离、错误迁移恢复等。
BootSaaS 为想要在 Spring Boot + Angular 环境下快速搭建安全、可扩展 SaaS 的团队提供了完整的架构与实现参考。
