这些是我与数据库中 users 节点有关的安全规则。
"users": {
"$uid": {
".read": "auth != null && $uid === auth.uid",
"$user_nodes": {
".write": "(auth != null && $uid === auth.uid) || (auth == null && $user_nodes.contains('connection'))"
}
}
}
使用这些规则进行身份验证后,尝试在我的 auth.uid 下读取全部信息,一切正常。由于某些原因,虽然不允许整个节点进行 set 操作,但允许进行 update 操作。有人可以告诉我为什么会这样吗?
编辑:因此,在代码中,读取操作将类似于以下内容:
userRef.child(auth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {...});
设置操作如下所示:
userRef.child(auth.getCurrentUser().getUid()).setValue(...);
我无法向您显示确切的代码,因为我在规则游乐场中测试规则时实际上遇到了我上面解释的行为。
答案 0 :(得分:1)
这是您的代码:
userRef.child(auth.getCurrentUser().getUid()).setValue(...);
此代码尝试对/users/$uid
进行设置,根据您的安全规则,这是不允许的。因此,如果写入被拒绝,则按预期运行。
根据您的规则,客户端可以写入或删除任何任何子节点,但它本身不能写入或删除/users/$uid
。这就是为什么update
语句起作用的原因:该语句有效地对set()
调用中存在的每个属性执行update
操作,而根据 规则。
通过考虑删除操作,最容易看到这里的区别:您的规则允许用户删除/users/$uid
的任何子节点,但他们不能一口气删除/users/$uid