
[英]Firestore security rules: check for not exists(/collection/document)
[英]How to check if document exists in firestore security rules list request?
我有两个根 collections、 users
和workspaces
。 用户文档有一个工作区数组,其中包含用户所属的工作区文档 ID。 以下是我尝试使用的安全规则。 我有两种方法,一种是从根集合中获取用户文档并检查其工作区数组中的 workspaceId,另一种是检查成员子集合中是否存在 userId。 两者最终都抛出相同的错误: FirebaseError: Null value error. for 'list' @ L15
FirebaseError: Null value error. for 'list' @ L15
如果我将允许读取分为允许获取和允许列表,并且只为列表写入 true,它会修复错误,但显然我想限制访问,因此用户只能获得自己的工作区(他们是成员) .
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /workspaces/{workspaceId} {
allow read: if isLoggedIn() && userIsInWorkspace(workspaceId);
}
function isLoggedIn() {
return request.auth != null && request.auth.uid != null;
}
function userIsInWorkspace(workspaceId) {
return exists(/databases/$(database)/documents/workspaces/$(workspaceId)/members/$(request.auth.uid));
}
}
}
获取方法:
function userIsInWorkspace(workspaceId) {
let workspacesOfUser = get(/databases/$(database)/documents/users/$(request.auth.uid)).data.workspaces;
return workspaceId in workspacesOfUser;
}
更新:
我尝试使用这样的自定义声明来实现它:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
allow read: if isLoggedIn() && request.auth.uid == userId;
}
match /workspaces/{workspaceId}/{document=**} {
allow read, write: if isLoggedIn() && userIsInWorkspace(workspaceId);
}
function isLoggedIn() {
return request.auth != null && request.auth.uid != null;
}
function userIsInWorkspace(workspaceId) {
return workspaceId in request.auth.token.workspaces;
}
}
}
所以我的概念是我有users
和workspaces
作为根集合, workspaces
有子集合,如teams
和reports
等。 我仍然得到相同的null value error
。 当出现上述错误时, list
请求会出现错误。 我的用例是,当您从应用程序中注销时,存储在 firestore 中每个工作区条目上的工作区 slug 都会添加一个查询参数,以便用户可以被重定向回确切的工作区。 为了实现这一点,我做了一个列表请求,所以基本上我查询了工作区集合,其中 slug 是来自 url 的给定 slug。
const workspaceSnapshot = await db
.collection('workspaces')
.where('slug', '==', this.$route.query.slug)
.limit(1)
.get()
这个请求造成了我的错误,但我无法从中找出任何东西。 我想当我给出一个包括get
和list
的读写条件时。
查询区分大小写。 您说您有两个根 collections,即Users
和Workspaces
,但是您正在查询users
和workspaces
。 这不会产生结果。 尝试更改您的查询:
function userIsInWorkspace(workspaceId) {
let workspacesOfUser = get(/databases/$(database)/documents/Users/$(request.auth.uid)).data.workspaces;
return workspaceId in workspacesOfUser;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.