由于我们组织中的某些成员的自定义声明超过1000个字符,因此我们开始将声明保存为字符串(希望这是正确的方法。
例如,如果到目前为止,用户组已经保存到这样的声明中:{groups: ['G1', 'G2', 'G3']}
现在我们像这样保存{groups: '|1|2|3'}
。然后根据安全规则,我试图将storage.tmpl.rules
中的字符串转换为数组。
function hasGroup(group) {
return isSignedIn() && getGroups().hasAny([group]);
// Also tried: group in getGroups()
}
function getGroups() {
// '|1|2|3' => ['', '1', '2', '3'] => '|G|G1|G2|G3' => ['', 'G1', 'G2', 'G3']
return request.auth.token.groups.split('|').join('|G').split('|');
}
match /path/path/{groupId}/path/{allPaths=**} {
allow write: hasGroup(groupId);
}
我一直被拒绝!我想念什么?此外,网络上没有资源可减少索赔额。而且您也无法在模拟器中进行调试。感谢您的阅读,任何帮助都会有所帮助。
如果您需要超出自定义声明的大小限制,那么您应该考虑的第一件事就是不使用自定义声明。相反,您可以将每个用户的数据存储在由用户的UID标识的文档中,然后将其存储在get()该文档中以检查其安全规则中的字段。清晰的示例可以在documentation中找到。例如:
// Allow the user to delete cities if their user document has the // 'admin' field set to 'true' allow delete: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true
在您对要求阅读文档的费用提出异议之前,我会指出,自定义声明本质上是受限制的,根本无法扩展。这是安全规则允许读取容量更大的文档的主要原因之一。当应用程序需要扩展到简单用例之外时,成本是不可避免的。
您应该具有其他规则来限制对用于存储每个用户权限的文档的写访问权限,因为用户可能无法编写确定对其他资源的访问权限的文档。