繁体   English   中英

Firebase 云存储规则能否针对 Firestore 数据进行验证?

[英]Can Firebase Cloud Storage rules validate against Firestore data?

我们可以使用 Firestore 数据来授予或限制对托管在 Firebase 云存储上的文件的访问权限吗?

我想用作 Firebase 安全规则的示例

allow write: if get(/databases/mydbname/documents/guilds/$(guildID)).data.users[(request.auth.uid)] in ["Admin", "Member"];

目前无法从其他产品的安全规则中访问不同的Firebase产品。 请参阅: 有没有办法在firebase存储规则中验证用户角色?

但似乎您正在尝试检查用户的组成员身份。 我建议您将其建模为所谓的自定义声明,而不是在数据库中查找该组成员身份。 除了(或除此之外)将成员资格写入数据库之外,您还可以使用Firebase管理SDK将声明“用户{uid}是组{guild1}的成员”设置到用户配置文件中

admin.auth().setCustomUserClaims(uid, {guild1: true}).then(() => {
  // The new custom claims will propagate to the user's ID token the
  // next time a new one is issued.
});

完成后,您可以检查安全规则中的公会成员资格:

allow read: if request.auth.token.guild1 == true;

(我不确定你是否/如何将公会会员资格建模为地图,如果情况确实如此,我会更新这个答案。)

您可以在使用云 function 触发器上传文件后追溯验证和删除文件。

警告:此技术并非防弹,因为如果 Cloud Function 触发器失败,无效文件将暂时或可能永久存储在 Cloud Storage 中。 我的偏好是首先阻止上传,但如果确定权限的逻辑位于 Firestore 中并且不能填充到自定义声明中,那么如果您使用 Firebase 的客户端 SDK 上传文件,这是目前唯一的方法。 如果您正在构建任务关键型系统,则应将文件上传到 Cloud Function,然后让 Cloud Function 将文件存储在 Cloud Storage 中。

上传文件时,添加一些元数据来指示上传者:

      const storageRef = ref(
        storage,
        `files/${fileName}`,
      );
      const uploadTask = uploadBytesResumable(storageRef, file, {
        customMetadata: {
          uploaderId: userId,
        },
      });

设置存储规则,确保用户身份元数据可信:

    match /files/{fileName} {
      allow create: if request.auth != null &&
        request.resource.metadata.uploaderId == request.auth.uid
    }

创建一个可追溯验证和删除的云 function 触发器:

export const onFinalize = functions
  .storage.object()
  .onFinalize(async object => {

    // We can trust object.metadata.uploaderId, so check Firestore if user is able to upload file
    if (!(await canUploadFile(object.metadata.uploaderId, object.name))) {
      await storage.bucket(object.bucket).file(object.name).delete();
      throw new Error(
        `Permission error: ${object.metadata.uploaderId} not allowed to upload ${object.name}`,
      );
    }

    // Continue
  });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM