javascript - Firebase 安全规则“列表为假”错误
问题描述
我有一个“课程”资源,允许不同级别的访问。
我为它设置了以下规则:
allow read:
if
isSuperAdmin() ||
adminBelongsToWorkSpace(workspaceId) ||
editorBelongsToWorkSpace(workspaceId) ||
(canView(resource) || canEdit(resource)) && belongsToWorkspace(workspaceId) ||
allCanView(resource) && belongsToWorkspace(workspaceId) ||
isPublicAccess(resource) && isPublished(resource);
访问级别基本上规定:
- 如果您是超级管理员,则可以访问
- 如果您是管理员并且属于工作区,则可以访问(所有课程都在工作区下)
- 如果您是编辑者并且属于工作区,则可以访问
- 如果您的 UID 在数组“canView”或“canEdit”中并且您属于工作区,则可以访问
- 如果课程是公共访问且已发布,则可以访问。(表示未经身份验证的用户)
我构建查询的方式是这样的:
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);
解决方案
推荐阅读
- c# - c# - 如何从包含动态创建的按钮的图片框中保存图像#
- azure - Azure 应用服务计划插槽是否共享 CPU/内存?
- xmppframework - Handle Xmpp group in objc
- c - 接受并返回指针的函数指针
- c++ - 修改后的二分搜索算法超过时间限制
- javascript - Unexpected behavior mixing process.nextTick with async/await. How does the event loop work here?
- javascript - React 16.7 有 State Hook,我可以在任何情况下使用函数组件而不是类组件吗?
- javascript - 如何打开 B 对话框 + 关闭 A 对话框(帮助)
- python - python新手,我收到一个属性错误
- android - 在android中获取多条送货短信