【问题标题】:How to create public/private user profile with Firebase security rules?如何使用 Firebase 安全规则创建公共/私人用户配置文件?
【发布时间】:2016-12-19 16:41:50
【问题描述】:
{
  "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" }
                 }
               }
            }
}
  • 我创建了这些规则来让用户公开/私人档案
  • users/{uid}/public”配置文件应该可供任何经过身份验证但无法访问数据的用户访问“用户/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"
      }
    }
  }
}

我想知道这是否是防止任何用户访问用户关键信息的可靠方法!无论如何我可以通过使用验证来改善这一点吗?我愿意接受你们的任何建议。我想为我的应用程序创建最好、最简单的安全规则。

【问题讨论】:

  • 请对您的标题进行拼写检查。

标签: json firebase firebase-security


【解决方案1】:

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

但您可能在某个时候想要的一个用例是显示所有用户的公共信息列表。使用您当前的数据结构是不可能的,因为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,这意味着您可以轻松地显示这些配置文件的列表。

【讨论】:

    【解决方案2】:

    嗯,(重新)构建数据库以便每个用户拥有一个公共和一个私有字段不是更容易吗?比如:

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

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

    【讨论】:

    • 我喜欢你把它分开的方式。我想我可以做到这一点,但是当我想向其中添加更多数据时,它不会在将来产生嵌套问题!有什么方法可以为公共数据创建单独的树?
    • 您可以将公共配置文件用于“默认”数据,并使用它在私有字段中查找其他内容。这样,您就不会在私有和公共中拥有相同数据的重复字段的混乱。您请求公共数据,然后是私有数据并在客户端合并它们
    • 我经常在 Firebase 中的所有资源上使用这种技术。事实上.. 即使是只公开的资源,我仍然使用public/ 命名空间,因此它们可以成为未来的证明。
    • 在我回答的模型中,您可以将侦听器附加到 /public_profiles 以获取所有用户的公共信息列表。我认为这在您拥有的模型中是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2021-01-12
    • 2019-01-01
    • 2013-11-22
    • 1970-01-01
    相关资源
    最近更新 更多