如果允许用户根据用户的电子邮件地址阅读文档中的文档,我想存储.多个用户应该可以访问同一文档.
根据文档, Firestore不允许查询数组成员.这就是为什么我将用户电子邮件地址存储在String-Bool Map中,并将电子邮件地址作为密钥.
对于以下示例,我没有使用电子邮件作为映射键,因为它已经不能使用基本字符串.
数据库结构如下所示:
lists
list_1
id: String
name: String
owner: E-Mail
type: String
shared:
test: true
Run Code Online (Sandbox Code Playgroud)
此处列出了所有安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /lists/{listId=**} {
allow read: if resource.data.shared.test == true
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如果我使用match /lists/{listId}而不是,它也不起作用match /lists/{listId=**}
我理解的是,如果地图中的shared[test]值为true ,则此安全规则应允许对每个人进行读取访问.
为了完整起见:这是我正在使用的查询(Android上的Kotlin):
collection.whereEqualTo("shared.test", true).get()
.addOnCompleteListener(activity, { task ->
if (task.isSuccessful) {
Log.i("FIRESTORE", "Query was successful")
} else {
Log.e("FIRESTORE", "Failed to query existing from Firestore. Error ${task.exception}")
}
})
Run Code Online (Sandbox Code Playgroud)
我猜我无法访问安全规则中的地图值.那么什么是我的问题的替代解决方案?
只是一个简单的问题:这是错误的,为什么这不起作用?
尝试与用户部分中具有"admin"角色的用户访问/ titles/{anyTitle},但仍然可以访问
权限丢失或不足.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow write: if false;
allow read: if false;
}
function userCanWrite () {
return get(/databases/{database}/documents/users/$(request.auth.uid)).data.role == "admin";
}
match /titles/{anyTitle=**} {
allow read: if request.auth != null;
allow write: if userCanWrite();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我从官方文件中尝试了另一条规则
get(/databases/{database}/documents/users/$(request.auth.uid??)).data.isAdmin == true;
这也不行
支持帮助我找到解决方案,这是你应该做的:
数据库结构:
用户 - > {{userid}} - > {role:"admin"}
数据库规则设置:
get(usersPath/$(request.auth.uid)).role =="admin"|| get(usersPath/$(request.auth.uid)).data.role =="admin";