【问题标题】:Setting Firebase realtime database rules设置 Firebase 实时数据库规则
【发布时间】:2019-01-18 00:51:21
【问题描述】:

我正在尝试为我的 Firebase 实时数据库设置规则,但我不知道它们为什么不起作用。这是数据顶部的样子:

假设我想允许用户读取他们的用户名与该数据中的名称字段匹配的数据。我认为这样的事情会起作用

{
  "rules": {
    "lauri_laurela" :{
      "$requestid" :{
        ".read" : "data.child('name').val() == auth.token.name",
      }
    }
  }
}

不幸的是,这对我不起作用。为了学习,我什至尝试过这个

{
  "rules": {
    "lauri_laurela" :{
      "$requestid" :{
        ".read" : "data.child('name').exists()",
      }
    }
  }
}

甚至

{
  "rules": {
    "lauri_laurela" :{
      "$requestid" :{
        ".read" : true,
      }
    }
  }
}

这是怎么做到的

{
  "rules": {
    "lauri_laurela" :{
       ".read" : true,
    }
  }
}

【问题讨论】:

  • 为什么不用用户 UID 而不是用户名?
  • 我计划稍后通过对 Andre 进行更改来使系统更加安全。但现在我的问题是,我什至无法让规则雇佣制发挥作用。
  • 我建议立即使用 UID。我个人认为在安全规则中使用起来要容易得多,并且使用 uid 的示例更多
  • 另外请附上您用来测试这些规则的代码。
  • 我在问题中添加了另外 2 个规则代码。问题是由于某种原因我的通配符标记不起作用,但我需要帮助找出原因。

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


【解决方案1】:

auth.token.name 仅在设置 name 时有效。因此,请确保您的用户将他们的姓名保存在他们的 firebase 身份验证配置文件中。您可以使用以下代码执行此操作。

 FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
    .setDisplayName("User name")
    .build();

user.updateProfile(profileUpdates)
    .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Log.d(TAG, "User profile updated. Now security rules work");
            }
        }
    });

为确保用户的姓名已保存,您可以将安全规则更改为

"auth.token.name!==null && data.child('name').val() == auth.token.name" 

"auth.token.name!=="" && data.child('name').val() == auth.token.name"

不确定哪一个有效!希望这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 2020-03-04
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多