我是firebase的新手 . 我已经设置了一个firebase实时数据库,如果读写规则设置为true,则可以读取和写入 .
我有身份验证问题 . 我已经设置了谷歌和电子邮件以及密码的身份验证 .
我的目标是允许任何用户读取数据,但只有一个用户(我自己)可以使用单个电子邮件地址和密码登录后写入数据 .
如果我使用google登录(规则设置为:auth!= null),我可以成功读取和写入数据库 .
如果我使用电子邮件地址和密码登录,我也可以使用相同的规则(auth!= null)读取和写入数据库 .
我不知道如何将其设置为仅允许使用电子邮件地址和密码登录的单个用户进行写访问 .
我已经尝试在规则中包含一个用户节点,但是在使用模拟器时我无法访问(见下文),并且在构建引用时我不知道如何包含uid(我可以在登录后获得) - 这是我目前使用的引用(使用设置为true的读写规则):
DatabaseReference databaseReference = mRootReference.child("Action_helper/1/Action_table_of_contents");
我没有在我的数据库中包含用户节点,因为我假设由firebase身份验证处理 .
这是我的数据布局:
我已经尝试使用各种规则选项的模拟器 . 在模拟器中使用这些设置测试访问权限(选择自定义提供程序选项):
Auth {“provider”:“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();
我将不胜感激1)制定我的规则,2)我是否以及如何更改我的数据结构,最后3)如何在数据库引用中包含uid,我将用它来将数据写入数据库 .
谢谢
2 回答
没有用户节点,因此在规则中定义无济于事 . 我认为可能有效的规则如下(假设0和1是uid):
默认情况下,如果我们不定义规则,则检查上述规则,然后它是假的,即在Action_helper中,读取和写入都是错误的 . 当涉及到节点uid(其中$表示通配符)时,我们检查登录用户的用户ID是否与该节点的uid相同,并相应地定义规则 .
我 highly recommend 要通过链接The key to Firebase security - Google I/O 2016,它非常有用,易于理解,并且到目前为止我用演示示例找到了最好的解释 .
数据布局取决于您的要求和屏幕 . 虽然Firebase允许32级嵌套,但强烈建议尽可能少地嵌套节点 . 考虑数据布局的其他重要事项是尽可能地将数据保持为非规范化,即使我们必须跨节点复制字段 .
要在数据库引用中包含uid,您可以继续追加每个子项:
所以,这里我们将从根节点引用到子节点“Action_helper”并进一步向下到它的子节点,该节点与uid和我们引用子节点“Action_table_of_contents”的uid相匹配 .
谢谢您的帮助 . 我设法让它工作(部分),但我不确定我是否正确地做到了 . 这是我的数据结构(我更改了名称) - 有一个用户节点(使用身份验证uid),以及两个包含数据的子节点:
这是我的规则:
本质上它在模拟器中工作,但在代码中,我能够登录和读写 . 但我现在有一个问题,如果我没有登录,那么在查询引用中传递的uid为null,如果我将一个虚拟值作为uid然后我根本无法访问数据(因为数据是在users / the_valid_uid节点和虚拟uid与the_valid_uid不匹配) .
那么如何在不对有效用户的uid进行硬编码的情况下构建数据库引用呢?这样我就可以访问Addiction_items和table_of_contents_items节点中的数据了(我的目的是允许任何人读取两个节点中的数据,但只允许一个用户(我自己)在用我的电子邮件地址登录后能够写入两个节点和密码?
谢谢