【问题标题】:Firebase security rules and authenticationFirebase 安全规则和身份验证
【发布时间】:2019-01-20 13:18:49
【问题描述】:

这是用例:

  1. 任何人都可以注册使用该应用程序。身份验证由 Firebase Auth 处理。

  2. 注册用户只能读取和写入自己的详细信息。对数据库的访问由 Firebase 安全规则管理。例如:

    {
      "rules": {      
             ".read" : "root.child('Admins').hasChild(auth.uid)",
             ".write" : "root.child('Admins').hasChild(auth.uid)",
      "Companies": {
           "$company" : {
               ".read" : "data.child('firebaseuid').val() === auth.uid", 
               ".write" : "data.child('firebaseuid').val() === auth.uid",
               "firebaseuid" : {
                                ".write" : ???? ,   
                                ".read" : ????,
               },
               "details" : {
                                ".read" :  "data.parent().child('firebaseuid').val() === auth.uid", 
                               ".write": "data.parent().child('firebaseuid').val() === auth.uid",  
               },
               },
       },
    }  
    

问题:“firebaseui”的适当安全规则是什么?

  1. 显然,将读/写属性设置为 true 是行不通的。那是一个开放的数据库。

    "firebaseuid" : {
      ".write" : true ,   
      ".read" : true,
    },
    
  2. 同样,:"auth !== null" 不起作用,因为它允许任何注册用户读取/写入每个人的信息。

    "firebaseuid" : {
      ".write" :"auth !== null" ,   
      ".read" :"auth !== null",
    },
    
  3. 将规则设置为只允许注册用户读/写工作......几乎。

    "firebaseuid" : {
      ".read" :  "data.parent().child('firebaseuid').val() === auth.uid", 
      ".write": "data.parent().child('firebaseuid').val() === auth.uid",  
    

    }

几乎,因为这会遇到第一次写入问题。也就是说,用户将无法在注册时初始化 firebase uid(“firebaseuid”),因为在第一个实例中,firebaseuid 字段为空,导致安全规则返回 false。

  1. 可以将 firebase 验证器添加到安全规则中,以便用户在且仅当字段为空白时才写入“firebaseuid”。如果只有一个注册用户,这就足够了。但是假设每个组织有多个管理员?在这种情况下,此解决方案将失败。

  2. 可能想编写一个在注册时触发的 Firebase Cloud 函数,但 Firebase 用户类不包含足够的信息。在注册时,唯一可用的信息是电子邮件密码。

  3. 可以编写一个由数据库创建或 http put 触发的更复杂的云函数,但我能想到的每种方法都有一个安全漏洞。

我意识到这一定是一个非常普遍的问题,所以必须有一个简单的答案。有人可以指出我正确的方向吗?

【问题讨论】:

  • 不确定我理解正确。 "firebaseuid" 属性是否意味着将创建该公司的用户的 UID 作为其值?
  • 如果您描述您想要拥有的用例,而不是您认为不起作用的所有选项,这可能会更容易理解。 IE。 “我的应用允许用户注册公司。注册公司的用户会自动成为该公司数据的管理员。公司的现有所有者可以向该公司添加新所有者。”
  • 弗兰克,是的,“firebaseuid”意味着拥有用户的 UID。这将启用此安全规则:“data.parent().child('firebaseuid').val() === auth.uid”,这与此处提出的建议一致:youtube.com/watch?v=PUBnlbjZFAI&t=1213s(时间 18:41)。
  • Frank,具体用例:我的 firebase 数据库中有一家公司,没有注册管理员。数据库中有一个表,其中包含预先批准的管理员的只读列表。预先批准的管理员 1) 使用 Firebase 身份验证进行注册,2) 应用程序在预先批准的表中查找电子邮件地址,3) 如果电子邮件匹配并且电子邮件经过验证,则注册完成。问题:Company/$company/details 的安全规则是什么?谢谢。
  • @RichardZ pre-approved table 和 Company/$company/details 是 2 个不同的表,对吗?

标签: firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

您通常希望允许用户将 firebaseuid 设置为他们自己的 UID,并且仅当它当前没有值时。所以:

"firebaseuid" : {
  ".write" : "!data.exists() && newData.val() === auth.uid"
},

【讨论】:

  • 谢谢。我不明白这如何解决允许多个管理员的情况。也就是说,“firebaseuid”是“firebaseuids”——授权管理员的 firebase uid 列表。这是我要解决的用例。 "firebaseuids" : { "vDAHhABUxJVb023z5PCAGJdy4wg1", "SemFmAWq2ZNe3nViOnuD8I85UXg1", etc... },并且此表中的其他字段使用此规则:".write": "data.parent().child('firebaseuids').hasChild (auth.uid)"
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
  • 2019-10-17
  • 2020-05-10
  • 2021-07-23
  • 2016-06-08
相关资源
最近更新 更多