Firebase安全规则-使用get函数

时间:2018-12-16 12:31:53

标签: firebase google-cloud-firestore firebase-security-rules

我正在尝试为我的Firestore实例设置安全规则,我有三个基本要求:

  1. 用户必须经过身份验证才能阅读
  2. 唯一的文件所有者 可以写信给他们的人(使用文档上的所有者字段来 验证)
  3. 任何管理员用户都可以写入任何文档

下面的代码实现了所有这些功能(不包括所有权检查),但是用于确定用户角色的get函数仅在与if条件位于同一行时指定才起作用。在下面的代码中,更新和删除适用于管理员,但不适用于创建人。

谁能告诉我为什么isAdmin()函数的计算结果不相同?

service cloud.firestore {
  match /databases/{database}/documents {

    // Only 'owners' of data can make changes to data
    match /posts/{post} {    
      allow read: if isAuthenticated();
      allow create: if isAuthenticated() && isAdmin();
      allow update, delete: if isAuthenticated() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1;      
    }
  } 

  /// FUNCTIONS ///
  function isAuthenticated() {
     return request.auth.uid != null;
  }

  // function requestIsOwner() {
  //   return request.resource.data.owner == request.auth.uid;
  // }

  // function resourceIsOwner() {
  //   return resource.data.owner == request.auth.uid;
  // }

  function isAdmin() {
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1
  }
}

1 个答案:

答案 0 :(得分:0)

您需要像这样在函数中传递 database 变量作为参数:

service cloud.firestore {
  match /databases/{database}/documents {

    // Only 'owners' of data can make changes to data
    match /posts/{post} {    
      allow read: if isAuthenticated();
      allow create: if isAuthenticated() && isAdmin(database);
      allow update, delete: if isAuthenticated() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1;      
    }
  } 

  /// FUNCTIONS ///
  function isAuthenticated() {
     return request.auth.uid != null;
  }

  // function requestIsOwner() {
  //   return request.resource.data.owner == request.auth.uid;
  // }

  // function resourceIsOwner() {
  //   return resource.data.owner == request.auth.uid;
  // }

  function isAdmin(database) {
    return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 1
  }
}