我在使用onDisconnect()。remove()处理身份验证/安全规则时遇到了一些麻烦。基本上我所拥有的是:
首先,我使用auth():
登录用户var rootRef = new Firebase(FIREBASE_URL + 'sites/' + FIREBASE_ROOT);
rootRef.auth(user.FIREBASE_TOKEN, loginCallback);
然后,我的loginCallback将当前用户注册为活动用户,并确保在断开连接时删除用户引用:
var activeUsers = $firebase(rootRef.child('pages/' + pageId + '/users')).$asArray();
var rawUser = {
id: user.id,
displayName: user.displayName
};
activeUsers.$add(rawUser).then(function (userRef) {
userRef.onDisconnect().remove();
});
我的Firebase特定部分的安全规则如下所示:
{
"rules": {
"sites": {
"$siteName": {
"pages": {
"$pageId": {
"users": {
// only users with firebase access can use this
".read": "auth.firebase_user === true"
"$arrayId": {
// users can only write their own data
".write": "auth.firebase_user === true && auth.id === newData.child('id').val()",
".validate": "newData.hasChildren(['id', 'displayName'])"
}
}
}
}
}
}
}
}
使用此安全配置和JS,当用户断开连接时,他们的引用不会从Firebase中删除。但是,如果我改为使用这些安全规则:
{
"rules": {
"sites": {
"$siteName": {
"pages": {
"$pageId": {
"users": {
// only users with firebase access can use this
".read": "auth.firebase_user === true",
".write": "true",
"$arrayId": {
// users can only write their own data
//".write": "auth.firebase_user === true && auth.id === newData.child('id').val()",
".validate": "newData.hasChildren(['id', 'displayName'])"
}
}
}
}
}
}
}
}
断开连接时正确删除了用户引用。
我已经尝试了许多不同的安全规则和JS实现,但它们最终基本上都遇到了这个问题。
有谁知道这里是否可能存在身份验证问题?用户的身份验证变量是否及时向Firebase移除用户?
一些注意事项:我使用的是AngularFire,这基本上是一种在线实现,用于查看其他人正在查看当前页面。
答案 0 :(得分:0)
想出来,看起来像安全规则那里弄乱我在Firebase中访问对象的方式。修改我的安全规则,使其看起来像这样:
{
"rules": {
"sites": {
"$siteName": {
"pages": {
"$pageId": {
"users": {
".read": "auth.firebase_user === true",
".write": "auth.firebase_user === true",
"$arrayId": {
".validate": "newData.hasChildren(['id', 'displayName']) && newData.child('id').val() === auth.id"
}
}
}
}
}
}
}
}
现在firebase用户可以读写,但他们编写的任何内容都必须符合验证规则。