设置Firebase实时数据库规则

时间:2018-08-10 11:53:02

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

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

Data Structure

说我想允许用户读取其用户名与该数据中的名称字段匹配的数据。我以为这样的事情会起作用

{
  "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,
    }
  }
}

1 个答案:

答案 0 :(得分:0)

auth.token.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"

不确定哪个有效!希望对您有帮助。