Firebase数据库身份验证与电子邮件&密码

时间:2016-08-07 18:48:04

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

我是firebase的新手。我已经设置了一个firebase实时数据库,如果读写规则设置为true,它可以读取和写入。

我的身份验证有问题。我已经设置了Google和电子邮件以及密码的身份验证。

我的目标是允许任何用户读取数据,但只有一个用户(我自己)可以在使用单个电子邮件地址和密码登录后写入数据。

如果我使用google登录(规则设置为:auth!= null),我可以成功读取和写入数据库。

如果我使用电子邮件地址和密码登录,我也可以使用相同的规则(auth!= null)读取和写入数据库。

我不知道如何将其设置为仅允许使用电子邮件地址和密码登录的单个用户进行写访问。

我已经尝试在规则中包含一个用户节点但是在使用模拟器时我无法访问(见下文)并且我不知道如何包含uid(我可以在记录后获得) in)构建引用时 - 这是我当前使用的引用(使用设置为true的读写规则):

DatabaseReference databaseReference = mRootReference.child("Action_helper/1/Action_table_of_contents");

我没有在我的数据库中包含用户节点,因为我假设由firebase身份验证处理。

这是我的数据布局:

enter image description here

我使用各种规则选项尝试了模拟器。在模拟器中使用这些设置测试访问权限(选择自定义提供程序选项):

Auth {"提供商" :" firebase"," uid" :" Rp3OgoaABMN3hqTv0aF29ECQRCQ2"}

注意:我使用我在Firebase身份验证中设置的电子邮件地址和密码登录后,从Firebase对象获取提供者和uid:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    if (user != null) {
        // User is signed in
        userId = user.getUid();
        String provider = user.getProviderId();

enter image description here

enter image description here

我将不胜感激1)制定我的规则,2)我是否以及如何更改我的数据结构,以及最后3)如何将uid包含在数据库引用中,我将用它来编写数据到数据库。

感谢

2 个答案:

答案 0 :(得分:1)

没有用户节点,因此在规则中定义无济于事。我认为可能有效的规则如下(假设0和1是uid):

   {
      "rules": {

         "Action_helper":{

           "$uid":{

               //user-based security
               ".read": "auth != null && $uid === auth.uid",
               ".write": "auth != null", 

           }//$uid

        }//Action_helper

   }// rules
}

如果我们不定义规则,则默认检查上述规则,然后它是假的,即在Action_helper中,读取和写入都是假的。当涉及到节点uid (其中$表示通配符)时,我们检查登录用户的用户ID是否与该节点的uid相同,并相应地定义规则。

强烈推荐去 通过链接The key to Firebase security - Google I/O 2016,它非常有用,易于理解,并且到目前为止我通过演示示例找到了最佳解释。

数据布局取决于您的要求和屏幕。虽然Firebase允许32级嵌套,但强烈建议尽可能少地嵌套节点。考虑数据布局的其他重要事项是即使我们将数据尽可能地保持非规范化 必须跨节点制作字段的副本。

要在数据库引用中包含uid,您可以继续追加每个子项:

DatabaseReference databaseReference = mRootReference.child("Action_helper).child(uid).child("Action_table_of_contents");

所以,这里我们将从根节点引用到子节点“Action_helper”并进一步向下传递给它的子节点,该子节点与uid和我们引用子节点“Action_table_of_contents”的uid相匹配。

答案 1 :(得分:0)

感谢您的帮助。我设法让它工作(部分),但我不确定我做得对。这是我的数据结构(我更改了名称) - 有一个用户节点(使用身份验证uid)和两个包含数据的子节点:

enter image description here

这是我的规则:

enter image description here

基本上它在模拟器中工作,但在代码中,我能够登录并读写。但我现在有一个问题,如果我没有登录,那么在查询引用中传递的uid为null,如果我将一个虚拟值作为uid,那么我根本无法访问数据(如数据在users / the_valid_uid节点下,虚拟uid与the_valid_uid不匹配。

那么如何构建数据库引用而无需对有效用户的uid进行硬编码?这样我就可以访问Addiction_items和table_of_contents_items节点中的数据了(我的目的是允许任何人读取两个节点中的数据,但只允许一个用户(我自己)在用我的电子邮件地址登录后能够写入两个节点和密码?

感谢