Firebase 实时数据库规则限制用户 ID 在模拟器中运行,但在 AngularFire 中不运行
Firebase RealTime database rules to restrict on user id runs in simulator but not in AngularFire
如果您查看屏幕截图,您会发现模拟测试通过了:
如果uid不匹配,则限制将用户数据添加到users节点。
可以看到位置是:
/users/6OCBYNh3CTammMWrCjX0F003zab2
换句话说:
/users/$uid
当我尝试从代码执行此操作时,出现权限被拒绝错误:
private async addNewUserToFirebase(user: firebase.User): Promise<void> {
console.log('adding user to Firebase', user);
try {
const ref = this.db.list('/users');
await ref.update(user.uid, {email: 'test@test.com'});
} catch (error) {
console.error('Unable to add user to firebase db', error);
}
}
@firebase/database: FIREBASE WARNING: update at
/users/6OCBYNh3CTammMWrCjX0F003zab2 failed: permission_denied
但是,如果我将规则更改为
".write": "auth != null"
然后就可以了。那么,为什么当我尝试匹配 uid 时会失败?
注意
我也试过:
const refAccount = this.db.list('/users');
await refAccount.update(`/${user.uid}`, {email: "test@test.com");
并得到同样的错误。
我在模拟器和代码中都尝试过多个用户。结果一致。
然而 this question 显示相同的规则,并且对于该 OP 它有效。
所以这似乎是 getRedirectResults()
的问题
进一步测试发现此代码有效(使用规则 userId === auth.id
):
this.angularFireAuth.onAuthStateChanged(user => {
firebase
.database()
.ref('users')
.child(user.uid)
.child('email')
.set('test@test.com');
});
但这不是,因为用户始终为空:
this.angularFireAuth.getRedirectResult().then(credential => {
firebase
.database()
.ref('users')
.child(credential.user.uid)
.child('email')
.set('test@test.com');
});
这仍然不能解释为什么有时 auth.uid !== null
有效。
但我似乎不是唯一在 getRedirectResults()
上拥有空用户的人,正如您所见 here and there is an official bug report here
如果您查看屏幕截图,您会发现模拟测试通过了:
如果uid不匹配,则限制将用户数据添加到users节点。
可以看到位置是:
/users/6OCBYNh3CTammMWrCjX0F003zab2
换句话说:
/users/$uid
当我尝试从代码执行此操作时,出现权限被拒绝错误:
private async addNewUserToFirebase(user: firebase.User): Promise<void> {
console.log('adding user to Firebase', user);
try {
const ref = this.db.list('/users');
await ref.update(user.uid, {email: 'test@test.com'});
} catch (error) {
console.error('Unable to add user to firebase db', error);
}
}
@firebase/database: FIREBASE WARNING: update at /users/6OCBYNh3CTammMWrCjX0F003zab2 failed: permission_denied
但是,如果我将规则更改为
".write": "auth != null"
然后就可以了。那么,为什么当我尝试匹配 uid 时会失败?
注意
我也试过:
const refAccount = this.db.list('/users');
await refAccount.update(`/${user.uid}`, {email: "test@test.com");
并得到同样的错误。
我在模拟器和代码中都尝试过多个用户。结果一致。
然而 this question 显示相同的规则,并且对于该 OP 它有效。
所以这似乎是 getRedirectResults()
进一步测试发现此代码有效(使用规则 userId === auth.id
):
this.angularFireAuth.onAuthStateChanged(user => {
firebase
.database()
.ref('users')
.child(user.uid)
.child('email')
.set('test@test.com');
});
但这不是,因为用户始终为空:
this.angularFireAuth.getRedirectResult().then(credential => {
firebase
.database()
.ref('users')
.child(credential.user.uid)
.child('email')
.set('test@test.com');
});
这仍然不能解释为什么有时 auth.uid !== null
有效。
但我似乎不是唯一在 getRedirectResults()
上拥有空用户的人,正如您所见 here and there is an official bug report here