基于引用数据类型的 Firebase Firestore 安全规则

Posted

技术标签:

【中文标题】基于引用数据类型的 Firebase Firestore 安全规则【英文标题】:Firebase Firestore security rules based on reference data type 【发布时间】:2018-08-18 18:04:12 【问题描述】:

在 Firestore 中,我有一个拥有者的项目集合。

所有者可以是用户,应该允许他阅读他的文档。

使用userId,您可以这样做:

allow read, write: if resource.data.userId == request.auth.uid;

但是对于 owner 参考字段,似乎没有关于安全规则的文档。

我试过这个安全规则:

allow read, write: if resource.data.owner == 'users/$(request.auth.uid)';

并像这样查询:

const owner = this.db.collection('/users').doc(auth.uid).ref;

const collection = this.db.collection('/items',
  (ref) => ref.where('owner', '==', owner)
);

但我仍然收到缺少权限或权限不足

【问题讨论】:

【参考方案1】:

引用在安全规则中被视为paths,因此您可以将其与

function checkUser() 
  return request.resource.data.userReference == /databases/$(database)/documents/users/$(request.auth.uid);

使用前面带有databases/$(database)/documents 的完整路径很重要。在这种情况下,我有一个名为 users 的集合,每个用户 id 都是他们的uid(看起来你也在这样做)

【讨论】:

【参考方案2】:

这两条规则都适用于模拟器(Firebase 控制台):

allow read, write: if resource.data.owner == 'users/' + request.auth.uid;

allow read, write: if path(resource.data.owner) == /users/$(request.auth.uid);

但不在我的代码查询中。

【讨论】:

以上是关于基于引用数据类型的 Firebase Firestore 安全规则的主要内容,如果未能解决你的问题,请参考以下文章

不能使用 firebase 引用数据类型来获取子集合

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

无法将数据添加到 Firestore 集合?

VueJS Firebase 应用程序导出默认错误的问题

Firebase 引用对象无法解析为类型