在客户端
你可以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() {
@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();