Firebase FireStore复杂的安全规则

时间:2018-10-01 03:58:35

标签: firebase google-cloud-firestore

有一个应用程序,其中我们有多个communities和一个用户,它们具有向write发送消息的角色。 每个社区都有自己的用户({communityId}/meta_users/{uid}),我编写了一个函数来访问用户的角色,我试图浏览该文档,但无法提供任何帮助。 模拟我检查了userRoleLevel是否允许读取,即使用户已分配了一个角色('admin')。 请帮助我纠正它。我粘贴了以下规则的代码段。让我知道是否需要更多信息

function userRoleLevel(community){
  return exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level)
  && get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
}

service cloud.firestore {
  match /databases/{database}/documents {
    // All read is allowed for now.
    match /{document=**} {
      allow read;
    }


    match /communities/{community} {
      allow write: if owner();
      match /{category}/{message}{
       allow write: if loggedIn() 
       && (userRoleLevel(community) in ['owner', 'admin', 'writer']);
      }

2 个答案:

答案 0 :(得分:0)

您具有函数userRoleLevel(),该函数返回布尔值而不是包含角色的字符串。除非您执行以下操作,否则将无法使用userRoleLevel(community) in ['owner', 'admin', 'writer']

function userRoleLevel(community){
  if( exists(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level) ) {
    return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
  } else {
    return false; // return something that won't match your roles
  }
}

答案 1 :(得分:0)

最后,我找到了解决此问题的方法。 事物是函数的位置,它在数据库架构的范围之外,并且它使用段变量作为数据库范围。

解决方案是在数据库架构内移动此功能。

    service cloud.firestore {
      match /databases/{database}/documents {
        // All read is allowed for now.
        match /{document=**} {
          allow read;
        }
        // function should be located here <--------
        function userRoleLevel(community){
      return get(/databases/$(database)/documents/communities/$(community)/meta_users/$(request.auth.uid)/roles/level).data.role;
    }
...
}

希望,这对其他人也有帮助。