用途:本技能面向使用 activerecord-tenanted 的多租户 Rails 应用,指导 Active Storage 的 blob 存放、直传与签名 ID 处理,避免上传成功但保存后图片 404、跨租户泄露等问题。单库应用只需使用 active-storage 技能,本技能是 Herald 叠加层。
主要能力:blob 存放于租户数据库(tenanted_rails_records = true),存储键形如 {tenant_key}/{token};提供租户签名 ID(ActiveStorage::TenantSignedId),将 blob id 与 tenant 一起签名;替换 /rails/active_storage/direct_uploads 为嵌套路由,在 with_tenant 内创建 blob 并返回 Rails 重定向 URL 而非 S3 地址;覆盖 Active Storage 重定向与 representations(变体)控制器,在对应分片内加载并处理。
必要配置:config.active_record_tenanted.tenanted_rails_records = true 与 config.active_record_tenanted.connection_class = "ApplicationRecord",否则 blob 行落入全局且键无前缀。
用法要点:直传控制器需 include ActiveStorage::SetCurrent,在租户内调用 ActiveStorage::Blob.create_before_direct_upload!,并返回 signed_id 等字段;blob_url_template 必须传 tenant,避免 Lexxy 生成无租户 URL;?tenant= 查询参数不得升级 legacy 签名 ID。
限制与注意:tenant-local 数字/UUID 不全局唯一,禁止首个匹配查找(存在 IDOR);legacy ID 歧义时失败关闭(一个匹配可,多个匹配返回 404);跳过租户库不存在的账户行;CSP 需添加 bucket 主机到 connect_src 与 img_src;非公开 bucket 不要设 public: true;直传与重定向问题应在真实 S3 服务测试。