如何使用Firebase安全规则创建公共/私人用户个人资料?

时间:2016-08-12 15:43:19

标签: json firebase firebase-security

{
  "rules": {
       "users": {
            "$uid":{ 
                 //Private whatever under "uid" but Public is exposed
                 ".read": "auth != null && auth.uid == $uid",
                 ".write": "auth != null && auth.uid == $uid",

                 "public": { ".read": "auth != null" }
                 }
               }
            }
}
  • 我已创建这些规则以使用户拥有公共/私人资料
  • 用户 / {uid} / 公共”配置文件应该可以由经过身份验证但无法访问数据的任何用户访问“用户/ UID

以下是存储在我的firebase数据库中的一些虚假数据。

{
  "users" : {
    "YFIIAgwa2kaannrXjwvSZmoywma2" : {
      "Name:" : "Example 1",
      //This public child should be accessible by 
      //"Example 2" but cannot know the name of 
      // this user
      "public" : {
        "email" : "example1@gmail.com"
      }
    },
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : {
      "Name:" : "Example 2",
      //This public child should be accessible by 
      //"Example 1" but cannot know the name of 
      // this user
      "public" : {
        "email" : "example2@gmail.com"
      }
    }
  }
}

我想知道这是否是阻止任何用户访问用户关键信息的有效方法!无论如何我可以使用验证来改善这一点吗?我对你们有任何建议持开放态度。我想为我的应用程序创建最好和最简单的安全规则。

2 个答案:

答案 0 :(得分:7)

您绝对可以使用当前数据结构保护对私有和公共数据的访问。

但是,您可能希望在某个时刻使用的一个用例是显示所有用户的公共信息列表。使用当前无法实现的数据结构,因为Firebase's security model cannot be used to filter data。有关此问题的最佳答案,请参阅Restricting child/field access with security rules

大多数开发人员将公共和私有数据拆分为完全独立的子树:

{
  "users" : {
    "YFIIAgwa2kaannrXjwvSZmoywma2" : {
      "Name:" : "Example 1",
    },
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : {
      "Name:" : "Example 2",
    }
  },
  "public_profiles": {
    "YFIIAgwa2kaannrXjwvSZmoywma2" : {
      "email" : "example1@gmail.com"
    },
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : {
      "email" : "example2@gmail.com"
    }
  }
}

然后,您可以使用以下方式保护访问权限:

{
  "rules": {
     "users": {
        "$uid":{ 
             ".read": "auth != null && auth.uid == $uid",
             ".write": "auth != null && auth.uid == $uid",
        }
     },
     "public_profiles": {
        ".read": "auth != null",
        "$uid":{ 
             ".write": "auth != null && auth.uid == $uid",
        }
     }
  }
}

现在,任何经过身份验证的用户都可以收听/public_profiles,这意味着您可以轻松显示这些个人资料的列表。

答案 1 :(得分:0)

嗯,(重新)构建数据库更容易,以便每个用户拥有一个公共字段和一个私有字段?类似的东西:

{
  "users" : {
    "YFIIAgwa2kaannrXjwvSZmoywma2" : {
      "private": { 
        "Name:" : "Example 1" 
      },
      "public" : {
        "email" : "example1@gmail.com"
      }
    },
    "YgSfSzPzxLbyDL17r6P9id2cdvH2" : {
      "private": { 
        "Name:" : "Example 2" 
      },
      "public" : {
        "email" : "example2@gmail.com"
      }
    }
  }
}

/ UPD:这种方式应该很容易(呃)拥有不同的权限,因为他们不会从父级继承它们?