Joh*_*ugh 8 firebase firebase-security google-cloud-firestore
我有两个集合 - 租户和用户。
租赁文档有一个名为“landlordID”的字段,其类型为 REFERENCE(不是字符串)。
现在在我的 Firestore 安全规则中,我希望仅当该租户的 ownerID 字段与发出请求的用户的 uid 匹配时才允许更新租户,即request.auth.uid.
将其读作“如果创建用户的用户经过身份验证,则允许更新租赁文档,因此 request.auth.uid != null,并且 ownerID 字段的 ID 应等于 request.auth.uid 的 ID。
因此代码应该是这样的:
service cloud.firestore {
match /databases/{database}/documents {
match /tenancies/{tenancyID}{
allow update: if request.auth.uid != null &&
request.auth.uid == get(resource.data.landlordID).id
}
}
Run Code Online (Sandbox Code Playgroud)
我也试过 get(/databases/$(database)/documents/users/$(resource.data.landlordID)).data.id
支持我的数据库截图
这应该很简单,但 get() 根本不起作用。Firebase Docs,滚动到“访问其他文档”对我的情况根本没有帮助,我不知道如何让它工作。
如果不能像这样使用引用,那将是一种耻辱,因为它们就像文档的任何其他字段一样。
这是我制作的一个对我有用的函数。我猜你有一个用户集合,其中的用户与id他们的用户具有相同的auth.uid
function isUserRef(field) {
return field in resource.data
&& resource.data[field] == /databases/$(database)/documents/users/$(request.auth.uid)
}
Run Code Online (Sandbox Code Playgroud)
根据您的用例进行调整,您可以这样调用该函数:isUserRef('landlordID')尽管它末尾的 ID 有点误导,因为该字段实际上是一个引用。
我在这里看到几个问题。第一个问题是 get() 函数需要一个完全指定的文档路径,如下所示:
get(/databases/$(database)/documents/users/$(resource.data.landlordID)).data.id
Run Code Online (Sandbox Code Playgroud)
第二个问题是您试图在规则中使用引用类型,不幸的是我认为这是不可能的。
Firestore 中的引用类型还不是很有帮助,我认为您应该将lordID 存储为字符串,然后您可以简单地执行以下操作:
service cloud.firestore {
match /databases/{database}/documents {
match /tenancies/{tenancyID}{
allow update: if request.auth.uid != resource.data.landlordID;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2585 次 |
| 最近记录: |