Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Firebase实时数据库安全规则允许更新,但不允许设置_Android_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

Android Firebase实时数据库安全规则允许更新,但不允许设置

Android Firebase实时数据库安全规则允许更新,但不允许设置,android,firebase,firebase-realtime-database,firebase-security,Android,Firebase,Firebase Realtime Database,Firebase Security,这些是我关于数据库中用户节点的安全规则 "users": { "$uid": { ".read": "auth != null && $uid === auth.uid", "$user_nodes": { ".write": "(auth != null && $

这些是我关于数据库中用户节点的安全规则

    "users": {
      "$uid": {
        ".read": "auth != null && $uid === auth.uid",
        "$user_nodes": {
          ".write": "(auth != null && $uid === auth.uid) || (auth == null && $user_nodes.contains('connection'))"
        }
      }
    }
当我通过身份验证并尝试读取我的auth.uid下的全部信息时,使用这些规则一切正常。由于某些原因,虽然不允许对整个节点执行设置操作,但不允许执行更新操作。有人能告诉我为什么会这样吗

编辑:因此,在代码中,读取操作如下所示:

userRef.child(auth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {...});
userRef.child(auth.getCurrentUser().getUid()).setValue(...);
集合操作的外观如下所示:

userRef.child(auth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {...});
userRef.child(auth.getCurrentUser().getUid()).setValue(...);
我无法向您显示确切的代码,因为我在规则操场测试规则时实际体验到了上面解释的行为

这是您的代码:

userRef.child(auth.getCurrentUser().getUid()).setValue(...);
此代码尝试在
/users/$uid
上进行设置,根据您的安全规则,这是不允许的。因此,如果写操作被拒绝,那么它将按预期工作

根据您的规则,客户端可以写入或删除任何子节点,但不能写入或删除
/users/$uid
本身。这也是
update
语句工作的原因:它有效地对
update
调用中存在的每个属性执行
set()
操作,这是根据规则允许的


考虑删除操作可能最容易看出这里的区别:您的规则允许用户删除
/users/$uid
的任何子节点,但不能一次删除
/users/$uid

请编辑问题以显示应用程序代码的示例,这些代码与您期望的规则不符。我们应该能够复制你所展示的内容并运行它,以便我们自己观察同样的行为。@DougStevenson我刚才编辑了这个问题。但正如我在那里所说的,我不能真正展示准确的代码,因为这种行为是在规则操场上体验到的。这对我的应用程序来说并不是什么大问题,但我只是想知道为什么在规则中允许对整个节点$uid进行更新操作,但设置操作不符合这些确切的规则。哦,我想我现在明白了。因此,基本上,
update
语句对
/users/$uid
下的每个子节点执行
set
操作,这就是为什么规则游乐场允许它?游乐场不允许它,但规则本身允许它。但是是的:因为您没有直接在
/users/$uid
上设置值,所以这是允许的。直接在
/users/$uid
上设置
将被拒绝。如果我的答案有用,请单击向上投票按钮(▲) 如果它回答了您的问题,请单击复选标记(✓) 接受它。这样别人就会知道你已经得到了(足够的)帮助。也请参见