2017-10-06 100 views
0

尝试实施,以便用户只能访问用户正在玩的游戏的游戏数据。 基本上,如果用户是玩家列表的一部分,用户应该能够阅读。我在所有$ GameID中都有参赛选手名单。 所有用户都有自己的唯一用户名,用户名 - > FirebaseID - >用户名值。Firebase规则,限制仅限参与用户访问

我可以得到以下工作,当模拟读取$ GameID中的用户是其中一部分的孩子,但它不给用户访问时,当我在我的应用程序中尝试精简版。

在电话应用:

GamesDataDatabase = FirebaseDatabase.getInstance().getReference("Games"); 
GamesDataDatabase.limitToFirst(50).addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      ...... 

规则:

"Games": { 
     "$GameID": { 
       ".read": "root.child('Games').child($GameID).child('metaData').child('players').child(root.child('Users').child(auth.uid).child('username').val()).exists()", 

似乎并没有什么区别,如果我取代 “数据” 与root.child( '游戏')子($。游戏ID)

数据结构: Data tree

试图东西回来和第四,但似乎并没有能够得到这个规则的工作... :(

回答

1

这里的问题开始代码:

GamesDataDatabase = FirebaseDatabase.getInstance().getReference("Games"); 
GamesDataDatabase.limitToFirst(50).addListenerForSingleValueEvent(... 

如果用户有读权限/Games此代码才有效。如果他们没有对/Games的读取权限,则会失败并显示“拒绝权限”。

将此情况与您无法将权限转移到较低级别的事实相结合,这意味着您无法使用Firebase安全规则来过滤数据。

这就是所谓的"rules are not filters" in the Firebase documentation,对于新开发Firebase安全模型的开发人员来说,这是一个常见的混淆之处。我建议你学习一些previous questions and answers以了解更多信息。

+0

如果我要迁移到Cloud Firsestore(新测试版程序),这项工作是否可行? – Mathoa

+0

我认为这可能确实符合这里描述的规则:https://firebase.google.com/docs/firestore/security/secure-data#shallow_queries但我还没有尝试过。 –

+0

不应该有可能为游戏添加read:false,并且由于Firebase实时数据库的构建,它应该检查下一级别(子级)的访问权限吗? 我试过这个,但得到了同样的结果,我的用户在应用程序中没有访问权限(即使模拟允许访问....) – Mathoa