Firebase 规则:动态授予特定用户访问权限

2023-12-06

我正在构建一个 Android 应用程序,它需要我为用户存储一些图片。

假设我有 2 个用户:A 和 B。他们应该能够读取/写入其特定文件夹:用户 A 可以读取和写入存储桶/images/userA,用户 B 可以读取和写入存储桶/images/userB。他们不应该有权访问任何其他东西。

现在假设用户A上传了图片1.jpg和图片2.jpg。用户A如何向用户B授予对bucket/images/userA/picture1.jpg的访问权限?但用户 B 不应该有权访问 picture2.jpg。

我正在寻找适合许多用户(~100.000+)的解决方案。我认为每次我想要授予对文件的访问权限时都向存储规则添加规则并不是一个好主意。

我现在使用的解决方案是,任何登录的人都可以阅读任何内容,只要他们有完整路径即可。该路径不容易猜到,当我想授予访问权限时,我会提供链接。这是一个足够安全的解决方案吗?我不这么认为。


在客户端

You can 使用自定义文件元数据为了那个原因。它的作用是添加一个Map<String, String>文件的元数据。由于 Map 中的键是唯一的,因此您可以将用户 B 的 id 存储为键并使用空字符串作为值:

StorageMetadata metadata = new StorageMetadata.Builder()
                        .setCustomMetadata(userId,"") //User B's id
                        .build();

然后使用updateMetadata()共享文件的方法:

picture1Ref.updateMetadata(metadata)
        .addOnSuccessListener(new OnSuccessListener<StorageMetadata>() {
            @Override
            public void onSuccess(StorageMetadata storageMetadata) {
                // Updated metadata is in storageMetadata
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Uh-oh, an error occurred!
            }
        });

在 Firebase 控制台上

然后,为了在 Firebase 端验证这一点,您可以设置规则如下:

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{userId}/{pictureName}{
      allow write: if request.auth.uid == userId;
      allow read: if request.auth.uid == userId || request.auth.uid in resource.metadata.keys();
    }
  }
}

分享给更多用户

如果您想与更多用户(假设用户 C 和 D)共享同一个文件,您可以重复相同的步骤,将他们的 ID 传递给自定义元数据,因为只有元数据中指定的属性会被更新,所有其他属性都保持不变。

撤销用户访问权限

如果要撤销特定用户的访问权限,可以为自定义元数据设置空值并调用updateMetadata()再次。

StorageMetadata metadata = new StorageMetadata.Builder()
                        .setCustomMetadata(userId, null)
                        .build();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 规则:动态授予特定用户访问权限 的相关文章

随机推荐