Firebase 数据库的权限错误
Permission Error on Firebase Database
我正在创建一个注册 Web 表单以创建用户并使用 UID 存储信息。我在尝试创建用户数据时收到 FIREBASE WARNING: set at /User/4FzbgqXVX8NlbB0pBkDdJeZ9HHe2 failed: permission_denied
。
我的firebase数据库规则如下。希望确保除了管理员和用户本身之外,所有用户都无法使用此数据
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
创建用户和写入数据的函数如下
<script>
function createUser() {
var Result = "true";
var textUser = document.getElementById('userName').value;
var textPassword = document.getElementById('userPassword').value;
var textAccountID = document.getElementById('accountRef').value;
var textDateCreated = document.getElementById('dateCreated').value;
var textDisplayName = document.getElementById('displayName').value;
var UID;
firebase.auth().createUserWithEmailAndPassword(textUser, textPassword).then(function(user){
console.log('uid',user.uid);//Here if you want you can sign in the user
UID = user.uid;
writeUserData(UID, textDisplayName, textAccountID, textDateCreated);
}).catch(function(error) {
//Handle error
var errorCode = error.code;
var errorMessage = error.message;
return Result = "false";
});
return Result;
}
function writeUserData(userId, displayName, accountID, dateCreated) {
firebase.database().ref('User/' + userId).set({
userId:{
AccountID: accountID,
Created: dateCreated,
Name: displayName}
});
firebase.auth().signOut().then(function() {
// Sign-out successful.
}, function(error) {
// An error happened.
});
}
</script>
有人知道我该如何解决上述问题吗?
更新
我已经把请求的节点改成了这样的用户
firebase.database().ref('users/' + userId).set({
firebase.database().ref('/users/' + userId).set({
firebase.database().ref('/users' + userId).set({
我的规则是这样的
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
但是我仍然收到以下与权限相关的错误消息
FIREBASE WARNING: set at /users/bgzolYFgEgY29WYsNEI0vyULXp13 failed: permission_denied
我也尝试过将规则改回默认规则,如下所示
,但是我仍然被拒绝许可
// These rules require authentication
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
我花了一些时间来纠正上述问题,但我很高兴我已经解决了它。对于那些也遇到类似问题的人,这里是答案
首先,我错误地将信息传递给了数据库。我提供了以下内容:
userId:{
AccountID: accountID,
Created: dateCreated,
Name: displayName}
我现在提供这个:
AccountID: accountID,
Created: dateCreated,
Name: displayName
我认为是上述原因导致了我的权限错误
这对一些电话有效,但并非全部如此...
其次,我认为 firebase 调用可能是异步任务,因此在 set 命令之后直接调用 signOut()
可能会导致我出现一些断断续续的结果。我正确地添加了所有的承诺并调用了 signOut()
并从这里写入数据函数。
现在一切似乎都很顺利
<script>
function createUser() {
var Result = "true";
var textUser = document.getElementById('userName').value;
var textPassword = document.getElementById('userPassword').value;
var textAccountID = document.getElementById('accountRef').value;
var textDateCreated = document.getElementById('dateCreated').value;
var textDisplayName = document.getElementById('displayName').value;
firebase.auth().createUserWithEmailAndPassword(textUser, textPassword).then(function(user){
console.log('uid',user.uid);//Here if you want you can sign in the user
console.log('success','user added in createUser');
writeUserData(user.uid, textDisplayName, textAccountID, textDateCreated);
}).catch(function(error) {
console.log('error','Error when creating user');
//Handle error
var errorCode = error.code;
var errorMessage = error.message;
return Result = "false";
});
return Result;
}
function writeUserData(userId, displayName, accountID, dateCreated) {
firebase.database().ref('users/' + userId).set({
AccountID: accountID,
Created: dateCreated,
Name: displayName
}).then(function() {
console.log('success','Added record in writeUserData');
signUserOut();
})
.catch(function(error) {
console.log('error','Error in writeUserData');
//Handle error
var errorCode = error.code;
var errorMessage = error.message;
return Result = "false";
signUserOut();
});
}
function signUserOut(){
firebase.auth().signOut().then(function() {
console.log('success','signed user out');
// Sign-out successful.
}, function(error) {
console.log('error','error signing out user');
var errorCode = error.code;
var errorMessage = error.message;
// An error happened.
});
}
</script>
我的数据库规则是这样的
{
"rules": {
"users": {
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".read": "$user_id === auth.uid",
".write": "$user_id === auth.uid"
}
}
}
}
感谢所有的帮助
我正在创建一个注册 Web 表单以创建用户并使用 UID 存储信息。我在尝试创建用户数据时收到 FIREBASE WARNING: set at /User/4FzbgqXVX8NlbB0pBkDdJeZ9HHe2 failed: permission_denied
。
我的firebase数据库规则如下。希望确保除了管理员和用户本身之外,所有用户都无法使用此数据
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
创建用户和写入数据的函数如下
<script>
function createUser() {
var Result = "true";
var textUser = document.getElementById('userName').value;
var textPassword = document.getElementById('userPassword').value;
var textAccountID = document.getElementById('accountRef').value;
var textDateCreated = document.getElementById('dateCreated').value;
var textDisplayName = document.getElementById('displayName').value;
var UID;
firebase.auth().createUserWithEmailAndPassword(textUser, textPassword).then(function(user){
console.log('uid',user.uid);//Here if you want you can sign in the user
UID = user.uid;
writeUserData(UID, textDisplayName, textAccountID, textDateCreated);
}).catch(function(error) {
//Handle error
var errorCode = error.code;
var errorMessage = error.message;
return Result = "false";
});
return Result;
}
function writeUserData(userId, displayName, accountID, dateCreated) {
firebase.database().ref('User/' + userId).set({
userId:{
AccountID: accountID,
Created: dateCreated,
Name: displayName}
});
firebase.auth().signOut().then(function() {
// Sign-out successful.
}, function(error) {
// An error happened.
});
}
</script>
有人知道我该如何解决上述问题吗?
更新
我已经把请求的节点改成了这样的用户
firebase.database().ref('users/' + userId).set({
firebase.database().ref('/users/' + userId).set({
firebase.database().ref('/users' + userId).set({
我的规则是这样的
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
但是我仍然收到以下与权限相关的错误消息
FIREBASE WARNING: set at /users/bgzolYFgEgY29WYsNEI0vyULXp13 failed: permission_denied
我也尝试过将规则改回默认规则,如下所示 ,但是我仍然被拒绝许可
// These rules require authentication
{
"rules": {
".read": "auth != null",
".write": "auth != null"
}
}
我花了一些时间来纠正上述问题,但我很高兴我已经解决了它。对于那些也遇到类似问题的人,这里是答案
首先,我错误地将信息传递给了数据库。我提供了以下内容:
userId:{
AccountID: accountID,
Created: dateCreated,
Name: displayName}
我现在提供这个:
AccountID: accountID,
Created: dateCreated,
Name: displayName
我认为是上述原因导致了我的权限错误
这对一些电话有效,但并非全部如此...
其次,我认为 firebase 调用可能是异步任务,因此在 set 命令之后直接调用 signOut()
可能会导致我出现一些断断续续的结果。我正确地添加了所有的承诺并调用了 signOut()
并从这里写入数据函数。
现在一切似乎都很顺利
<script>
function createUser() {
var Result = "true";
var textUser = document.getElementById('userName').value;
var textPassword = document.getElementById('userPassword').value;
var textAccountID = document.getElementById('accountRef').value;
var textDateCreated = document.getElementById('dateCreated').value;
var textDisplayName = document.getElementById('displayName').value;
firebase.auth().createUserWithEmailAndPassword(textUser, textPassword).then(function(user){
console.log('uid',user.uid);//Here if you want you can sign in the user
console.log('success','user added in createUser');
writeUserData(user.uid, textDisplayName, textAccountID, textDateCreated);
}).catch(function(error) {
console.log('error','Error when creating user');
//Handle error
var errorCode = error.code;
var errorMessage = error.message;
return Result = "false";
});
return Result;
}
function writeUserData(userId, displayName, accountID, dateCreated) {
firebase.database().ref('users/' + userId).set({
AccountID: accountID,
Created: dateCreated,
Name: displayName
}).then(function() {
console.log('success','Added record in writeUserData');
signUserOut();
})
.catch(function(error) {
console.log('error','Error in writeUserData');
//Handle error
var errorCode = error.code;
var errorMessage = error.message;
return Result = "false";
signUserOut();
});
}
function signUserOut(){
firebase.auth().signOut().then(function() {
console.log('success','signed user out');
// Sign-out successful.
}, function(error) {
console.log('error','error signing out user');
var errorCode = error.code;
var errorMessage = error.message;
// An error happened.
});
}
</script>
我的数据库规则是这样的
{
"rules": {
"users": {
"$user_id": {
// grants write access to the owner of this user account
// whose uid must exactly match the key ($user_id)
".read": "$user_id === auth.uid",
".write": "$user_id === auth.uid"
}
}
}
}
感谢所有的帮助