在客户端
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();