我正在尝试创建一个 Firebase 实时数据库安全规则集,该规则集仅向具有特定白名单 UID(在数据库中的其他位置存储和匹配)的用户授予读取权限。
假设这些列入白名单的用户正在运行监听器,主动接收数据库事件。如果我从白名单中动态删除他们的 UID,他们的监听器会停止工作吗?
最佳答案
Firebase 可以很好地处理这种情况。它会跟踪评估安全规则时读取哪些节点,然后在其中一个节点发生更改时重新评估该规则。
我使用以下规则验证了这一点:
"63595280": {
"allowed": { ".read": true },
"data": {
".read": "data.parent().child('allowed').child(auth.uid).exists()",
".write": true
}
},
因此,当某人的 UID 位于 allowed
节点中时,就允许某人读取 data
节点。
测试脚本(也在 https://jsbin.com/dixonoy/edit?js,console 上):
firebase.auth().signInAnonymously();
firebase.auth().onAuthStateChanged(function(user) {
console.log(user ? 'user: '+user.uid : 'no user');
});
var ref = firebase.database().ref("63595280");
ref.child('allowed').on('value', function(snapshot) {
console.log('allowed: '+JSON.stringify(snapshot.val()));
});
console.log("Adding a listener");
ref.child('data').on('value', function(snapshot) {
console.log(snapshot.val());
}, function(error) {
console.error('error: '+JSON.stringify(error));
});
setInterval(function() {
ref.child('data').set(new Date().toString());
}, 10000)
编写的代码只是每 10 秒设置一次当前日期/时间。
输出:
Adding a listener
allowed: {"m4yXaC9wmCdJXOiL2LDPEJDPoHw1":true,"uid":true}
Thu Aug 27 2020 15:54:52 GMT-0700 (Pacific Daylight Time)
Thu Aug 27 2020 15:55:02 GMT-0700 (Pacific Daylight Time)
Thu Aug 27 2020 15:55:12 GMT-0700 (Pacific Daylight Time)
Thu Aug 27 2020 15:55:22 GMT-0700 (Pacific Daylight Time)
error: {"code":"PERMISSION_DENIED"}
allowed: {"uid":true}
您会看到允许的节点最初包含 UID,因此监听器已成功附加。然后它会打印一些值,直到我(在 Firebase 控制台中)删除允许的 UID。然后,您会看到 PERMISSION_DENIED
和 allowed
的新值。
我原来的(错误的)假设如下...
Firebase 检查安全规则中的读取权限:
- 当附加监听器时。
- 当客户端的身份验证状态发生变化时。
由于在您的场景中这两种情况都没有发生,因此我希望它不会立即拒绝现有监听器,而仅在重新连接时才这样做。但这是您应该能够很快测试的东西,因此我建议您尝试一下并在此处报告您的发现。
关于firebase - 撤销实时数据库中的读取访问权限是否会立即断开事件监听器的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63595280/