我有一个“课程”资源,允许对其进行不同级别的访问。
我已经为它设置了以下规则:
allow read:
if
isSuperAdmin() ||
adminBelongsToWorkSpace(workspaceId) ||
editorBelongsToWorkSpace(workspaceId) ||
(canView(resource) || canEdit(resource)) && belongsToWorkspace(workspaceId) ||
allCanView(resource) && belongsToWorkspace(workspaceId) ||
isPublicAccess(resource) && isPublished(resource);
访问级别基本上规定:
我构建查询的方式是这样的:
const ref = firestore
.collection('workspaces')
.doc(workspaceId)
.collection('courses');
let courses;
let data;
try {
if (getAll) {
data = await ref.get();
} else {
if (publicAccess) {
ref.where('publicAccess', '==', true);
ref.where('published', '==', true);
}
if (allCanView) {
ref.where('published', '==', true);
ref.where('allCanView', '==', true);
}
if (userId) {
ref.where('published', '==', true);
ref.where('allCanView', '==', true);
ref.where('canView', 'array-contains', userId);
ref.where('canEdit', 'array-contains', userId);
}
data = await ref.get();
}
您可以看到我查询的文档以布尔值为条件,例如 publicAccess、allCanView 和 UserId(字符串)。 GetAll 布尔值用于编辑器/管理员/超级管理员正在尝试查询的情况,在这种情况下,您可以获得所有内容。
在控制台我收到这个错误,我不知道如何处理它:
FirebaseError:
false for 'list' @ L103
L103 - 第 103 行,指向“isSuperAdmin()”,该函数如下:
function isSuperAdmin() {
return isSignedIn() && request.auth.token.superadmin == true;
}
更新:
我在规则操场上测试了规则,它们可以很好地获取数据。所以我猜是查询以及它们的构建方式是问题所在。
当用户不是管理员,只是用户,但在 canView/canEdit 数组中有他的 ID 时会发生错误。
但据我所知这是正确的:
ref.where('canView', 'array-contains', userId);
ref.where('canEdit', 'array-contains', userId);