当前位置: 首页 > 知识库问答 >
问题:

我如何制定firebase规则,允许auth用户阅读所有文档,但只创建自己的用户文档,而不给自己管理权限?

督德明
2023-03-14

我正在与firebase安全规则作斗争,我可以让它的一部分工作,但当我试图将它连接在一起时,我有问题。
我希望我的规则做到以下几点:

>

  • 如果经过身份验证,允许读取所有文档

    function getRole(role) {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny([role]);
      }
    

    这里是什么我有,不包括用户能够创建他们自己的用户帐户。它只允许管理员写任何文档。

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
      function getRole(role) {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny([role]);
      }
        match /{document=**} {
          allow read: if true;
          allow write: if getRole('admin') == true;
        }
      }
    }
    

    下面是我试图添加的内容,以允许用户创建他们的用户文档。它似乎没有级联到下一个规则,它尝试match/{document=**}路径中的getRole,发现用户不是管理员,所以失败了。我尝试重新排序并将/users/path放置在上面,它很好地通过了该路径,然后执行相同的操作,在/{document=**}路径中的getRole上再次失败。我还尝试指定文档名称,而不是使用通配符,这似乎不允许任何get或write。你能给我指个正确的方向吗?

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
      function getRole(role) {
        return exists(/databases/$(database)/documents/users/$(request.auth.uid)) && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny([role]);
      }
        match /{document=**} {
          allow read: if true;
          allow write: if getRole('admin') == true;
        }
        match /users/{userId}{
          allow read: if  request.auth.uid != null;
          allow create: if getRole('admin') == true ||  request.auth.uid == userId  &&
                !(getAfter(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny(["admin"]));
          allow update: if getRole('admin') == true ||  request.auth.uid == userId  && exists(/databases/$(database)/documents/users/$(request.auth.uid)) == true && !(getAfter(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny(["admin"]));
          }
      }
    }
    
  • 共有1个答案

    徐俊楚
    2023-03-14

    事实证明,除非使用match/{document=**},否则我不能允许admin动态创建未在安全规则中定义的集合,因为它将这些规则应用于每个路径,而不是所需的结果。我能够很容易地设置规则来完成其他部分,如下所示:

    service cloud.firestore {
      match /databases/{database}/documents {
       function getRole(role) {
        return get(/databases/$(database)/documents/users/$(request.auth.uid)).data.roles.hasAny([role]);
      }
        match /users/{userId} {
          allow read: if request.auth.uid != null;
          allow create: if request.auth.uid == userId && request.resource.data.roles.hasAny(["admin"]) == false;
        }
        match /collectionName/{collectionNameId} {
          allow read: if request.auth.uid != null;
          allow write: if request.auth.uid != null && getRole('admin') == true;
        }
      }
    }
    
     类似资料:
    • 我花了最后一天的时间试图做一些关于消防规则的事情,但我似乎找不到任何地方的解决方案。我对这个火炉规则很陌生,所以请耐心:) 我目前有以下规则:

    • 我需要你对LDAP结构和相关ACL的建议。 我们的LDAP将管理10个(数量可能不同)组织,其中包含用户(总共250个用户),我希望每个组织允许1个用户管理他自己组织的所有用户。用户也将附加到自定义组。 我已经读过: http://www.openldap.org/doc/admin24/access-control.html http://www.openldap.org/faq/data/ca

    • python 用 with 打开文档没有如何自己创建 python 用 with 打开文档没有如何自己创建

    • Firestore数据库的图像 如上图所示,所有用户都有一个自动生成的ID。如何使用经过身份验证的用户的userID并将其用作用户集合内的文档ID?

    • 问题内容: 我希望有 多个 MySQL用户能够发出类似的命令 但是我也希望这些用户中的每一个都只能看到和访问他们 自己的 数据库。 我所能找到的就是如何由DBA创建数据库并将该数据库的特权授予特定用户: 或将所有数据库的特权授予用户: 但是我也不想要,因为它需要扩展和安全。 问题答案: 您可以使用 授予用户名称以开头的所有数据库的用户特权。 这允许测试用户创建限制于以testuser_开头的名称的

    • 我有我的API文件与大摇大摆。为了方便开发人员,我想在我的网站上提供的招摇过市的图形用户界面以及。但是,我的提供商尚未安装php yaml扩展。这意味着我不能在自己的网站上使用GUI。 所以,我想使用第三方GUI。我知道我可以使用https://petstore.swagger.io/,并在文本框中输入到我的yaml文件的链接。这也不是真正的用户友好。我更喜欢在调用url时打开GUI并指定yaml