gpt4 book ai didi

android - Firebase 规则 : dynamically give access to a specific user

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:24 25 4
gpt4 key购买 nike

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

假设我有 2 个用户:A 和 B。他们应该能够读取/写入他们的特定文件夹:用户 A 可以读取和写入 bucket/images/userA,用户 B 可以读取和写入 bucket/images/用户B。他们不应访问任何其他内容。

现在假设用户 A 上传了 picture1.jpg 和 picture2.jpg。用户 A 如何将 bucket/images/userA/picture1.jpg 的访问权限授予用户 B?不过,用户 B 不应访问 picture2.jpg。

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

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

最佳答案

在客户端

您可以 use custom File Metadata为了那个原因。它的作用是添加一个 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();

关于android - Firebase 规则 : dynamically give access to a specific user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com