【发布时间】:2021-10-11 11:37:14
【问题描述】:
你好,我在我的用户集合中有一个角色,我想根据角色编写规则,所以如果角色是老师,你可以访问比父角色更多的东西。现在我的问题是我有可能访问该角色并将其用于每个集合,而不仅仅是用户集合。就像每次只检查你的角色是什么的功能? 我是第一次这样做,到目前为止,我不太确定我是否理解所有内容。
这是我目前的规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
function isOneOfRoles(rsc, array) {
return isSignedIn() && ((getRole() in array) || rsc.data.openWorld == true);
}
function getRole() {
return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 'pädagoge';
}
match /posts/{userPosts} {
allow read: if isSignedIn();
allow create: if isOneOfRoles(resource, ['pädagoge']);
}
match /messages/{messages} {
allow read, write: if isSignedIn();
}
}
}
更新
【问题讨论】:
-
"是否有可能我可以访问该角色并将其用于每个集合" => 是的,它是像你一样定义函数或像explained in the doc。我没有检查您的规则,但是您目前在使用这些规则时遇到了什么问题?
-
更彻底地查看您的规则,您似乎应该在
if isOneOfRoles(resource, ['pädagoge']);中使用request.resource而不是resource,但这取决于您的确切查询。 (文档摘录:“写入数据时,您可能希望将传入数据与现有数据进行比较。在这种情况下,如果您的规则集允许挂起写入,则request.resource变量包含文档的未来状态。”) -
我试图测试在 userPost 中创建我收到此错误: Function [get] called with wrong path: /databases/(default)/documents/users/
-
你如何测试?通过控制台中的模拟器或通过您部署的应用程序?
-
通过模拟器。
标签: google-cloud-firestore firebase-security