因此,我整天都在砸墙,试图回踩和调试我的Firestore规则。我已经将其剥离回到问题所在,希望可以使它更容易解释。
一切正常如果,如果按照我的规则这样做:
service cloud.firestore {
match /databases/{database}/documents {
match /user_partnerships/{partnershipId} {
allow read: if 0 == 0;
}
}
}
它按预期返回2个文档,其ID为 cLMZw4EqkSLnafGt8wz7 和 ky4hxaEqI8BeLFoip2DF 。
通过使用以上代码并返回数据,我知道查询本身不是问题,因为该规则允许查询所有数据。
继续讨论这个问题。.如果我现在将以上内容更改为以下内容,它将停止工作并说我没有权限:
service cloud.firestore {
match /databases/{database}/documents {
match /user_partnerships/{partnershipId} {
allow read: if exists(/databases/$(database)/documents/user_partnerships/$(partnershipId));
}
}
}
这肯定是没有意义的,因为该规则正在处理的当前文档就是它所查询的内容,并且显然存在。.
因此,规则中的 {partnershipId} 参数似乎没有传递给get()函数,并且似乎根本无法访问
我检查了是否可以通过在get()函数中键入我知道的id来模拟一个工作规则,并且可以正常工作:
service cloud.firestore {
match /databases/{database}/documents {
match /user_partnerships/{partnershipId} {
allow read: if exists(/databases/$(database)/documents/user_partnerships/ky4hxaEqI8BeLFoip2DF) || exists(/databases/$(database)/documents/user_partnerships/cLMZw4EqkSLnafGt8wz7);
}
}
}
这有效!这样就表明传递 partnershipId 变量无效吗?
现在这不是我打算使用的规则,我打算使用 partnershipId 查询某些内容以收集角色权限,但是由于 partnershipId 并没有,甚至似乎都无法访问,我什至无法开始。
请帮助?我似乎根本无法访问 match / user_partnerships / {partnershipId} 变量。
编辑:另一个没有任何意义的例子:
这有效
service cloud.firestore {
match /databases/{database}/documents {
match /user_partnerships/{partnershipId} {
allow read: if resource.data.permissionOwner == request.auth.uid;
}
}
}
但这不是吗?
service cloud.firestore {
match /databases/{database}/documents {
match /user_partnerships/{partnershipId} {
allow read: if get(/databases/$(database)/documents/user_partnerships/$(partnershipId)).data.permissionOwner == request.auth.uid;
}
}
}