我遇到了找不到信息的问题。似乎没有多少人在 firebase 中使用自定义元数据,我找不到关于它的明确文档。
所以,基本上,我正在做的是给我正在上传的文件提供一个新的自定义元数据,我称之为 GroupID,在 firebase 安全规则中,我正在检查这个 GroupID 是否等于我的路径中的某些内容文件。这是我的规则:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
// Get/Set a challenge in storage
match /Groups/{GroupID}/Challenges/{ChallengeType}/{PlayerID}/{File} {
allow read: if request.auth.uid != null;
allow write: if request.auth.uid == PlayerID
&& request.resource.size < 25 * 1024 * 1024
&& request.resource.metadata['GroupID'] == GroupID;
}
}
}
我能够确保问题来自最后一个条件。我使用所有这些变体:
request.resource.metadata['GroupID'] == GroupID;
request.resource.metadata["GroupID"] == GroupID;
request.resource.metadata.GroupID == GroupID;
resource.metadata['GroupID'] == GroupID;
resource.metadata["GroupID"] == GroupID;
resource.metadata.GroupID == GroupID;
此外,我能够知道 GroupID 是一个字符串,而所有元数据 ['GroupID'] 及其变体都不是字符串。所以问题可能来自这里。 但是,当我统一创建元数据时,它们被创建为字符串。
最后一件事,使用 Firebase 安全规则模拟器有效。
对于元数据,您可能需要我的统一代码:
MetadataChange fileMetadata = new MetadataChange()
{
CustomMetadata = new Dictionary<string,string>
{
{ "GroupID",group_ID },}
};
我是不是在 C# 或 Firebase 安全规则中做错了什么?
预先感谢您的帮助!
阿德里安
编辑 1:我忘记了,但是当我不检查元数据时,我可以将文件放在 firebase 存储中,元数据在这里: