1.4 KiB
1.4 KiB
租户安全策略
隔离级别
LJWX Platform 采用行级隔离(Row-Level Isolation),所有租户共享同一数据库 schema。tenant-scoped 表通过 tenant_id 列区分数据归属。
表级分类
- 全局表(不含 tenant_id):
tenants、permissions。这些表的数据对所有租户可见或由平台统一管理。 - tenant-scoped 表(含 tenant_id):
users、roles、user_roles、role_permissions、audit_log。这些表的每条数据都归属于特定租户。
tenant_id 来源
tenant_id 仅从 JWT token 中提取,经过 JwtAuthenticationFilter 解析后存入 Spring Security 的 SecurityContext(UserContext 对象)。业务代码通过 SecurityContextHolder.requireTenantId() 获取当前租户 ID。
严格禁止从请求参数、路径变量、请求体(DTO)中获取 tenant_id 用于数据过滤或写入。即使请求体中携带 tenant_id 字段,服务端也会忽略并使用 SecurityContext 中的值强制覆盖。
跨租户访问防护
当用户试图访问不属于其租户的资源时,系统返回 HTTP 403,错误码为 TENANT_ACCESS_DENIED。所有 tenant-scoped 表的 SQL 查询必须包含 WHERE tenant_id = ? 条件(由 Repository 实现层保证)。
MVP 限制
- 不实现跨租户的 super_admin 角色
- 不对外提供创建租户的 API(租户通过 seed 和运维脚本管理)
- 不实现租户级别的配置隔离