客户无权访问Firebase

时间:2016-10-04 10:37:26

标签: angularjs firebase firebase-realtime-database firebase-authentication angularfire

我有一个调用addCheckin()方法的页面,它位于控制器内部。在控制器中,我尝试按如下方式创建引用:

var ref = firebase.database().ref("users/" + $scope.whichuser + "/meetings/" +$scope.whichmeeting + "/checkins");

$scope.whichuser$scope.whichmeeting是我从另一条路线传递的$routeParams。 这是我的签到控制器 -

myApp.controller("CheckinsController",
    ['$scope','$rootScope','$firebaseArray','$routeParams','$firebaseObject',
    function($scope,$rootScope,$firebaseArray,$routeParams,$firebaseObject){

        $scope.whichuser = $routeParams.uid;
        $scope.whichmeeting = $routeParams.mid;

        var ref = firebase.database().ref("users/" + $scope.whichuser + "/meetings/" +$scope.whichmeeting + "/checkins");

        $scope.addCheckin = function(){
            var checkinInfo = $firebaseArray(ref);
            var data={
                firstname:$scope.firstname,
                lastname:$scope.lastname,
                email:$scope.email,
                date:firebase.database.ServerValue.TIMESTAMP
            }

            checkinInfo.$add(data);
        }

}]);/*controller*/

我在这里遇到两个错误 -

错误1:

Error: permission_denied at /users/Vp2P1MqKm7ckXqV2Uy3OzTnn6bB3/meetings: Client doesn't have permission to access the desired data.

错误2:

Error: permission_denied at /users/Vp2P1MqKm7ckXqV2Uy3OzTnn6bB3/meetings/-KT5tqMYKXsFssmcRLm6/checkins: Client doesn't have permission to access the desired data.

这就是我要实现的目标 -

enter image description here

8 个答案:

答案 0 :(得分:28)

转到应用的Firebase控制台

从侧面菜单中选择数据库 - >从上方的标签中选择规则 - >像这样更新您的规则

{
    "rules": {    
        ".read": true,
        ".write": true
    }
}

希望它能解决你的问题。谢谢:))

答案 1 :(得分:1)

为了授予所有经过身份验证的用户访问权限,请转到 firebase Web控制台中的数据库规则标签,然后复制/粘贴以下规则:

{
   "rules": {
    ".read": "auth != null",
    ".write": "auth != null"    
    }
}

答案 2 :(得分:1)

这些答案都没有提供设置实时数据库的最安全方法。

  • 您不希望任何人随意访问或写入您的数据库
  • 即使用户通过了身份验证,您也不希望他们访问其他人的数据

此规则应适用于所有情况:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

答案 3 :(得分:0)

似乎可以写入/ users / {uid}路由,但无法读取它们。我将/ users更改为/ userx,它立即开始工作。

答案 4 :(得分:0)

默认情况下,Firebase项目以Firestore作为数据库开始。

如果应用程序使用“ Firebase实时数据库”并且未配置其权限,则可能发生此问题。应该明确授予对Firebase实时数据库的读写权限。

为此,请在Firebase控制台中,从“数据库”>“规则”>“设置”旁边的下拉菜单中选择“数据库”>“选择实时数据库”,而不是“ Firestore Beta”。

{
/* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
"rules": {
".read": true,
".write": true
}
}

希望有帮助!

答案 5 :(得分:0)

所有提供的答案都包含一个安全问题,每个人都可以在数据库中写入/删除条目,例如,如果使用不当,可能会导致大量费用或完全丢失数据。

当然,您需要使用Firebase身份验证功能来使用这些规则,但是默认情况下,禁止匿名访问具有默认权限。以下规则在保持安全性的同时为所有人提供了读取权限。

{
    "rules": {
        ".read": true,
        ".write": "auth.uid != null"
    }
}

答案 6 :(得分:0)

我希望这可以为您提供帮助。

{
    ".read": true,
    ".write": "auth !== null && root.child('users').child(auth.uid).child('meetings').val() ===  true"
}

您可以删除字符串 && root.child('users').child(auth.uid).child('meetings').val() === true"

结果相同。

答案 7 :(得分:0)

请使用以下代码在Firebase中注册自己

Firebase.auth()
            .createUserWithEmailAndPassword(email, password)
            .then((data) => console.log(data))
            .catch(error => console.log(error))

并通过以下代码使用注册的电子邮件和密码对您的身份进行验证

Firebase.auth()
           .signInWithEmailAndPassword(email, password)
           .then((data) => console.log(data))
           .catch(error => console.log(error))

在实时数据库中使用以下规则

{
   "rules": {
    ".read": "auth != null",
    ".write": "auth != null"    
    }
}

然后您将能够自动访问实时数据库中的数据

var ref = firebase.database().ref("users");
ref.on("value", function(snapshot) {
 snapshot.forEach(function(childSnapshot) {
  var childData = childSnapshot.val();
  var id=childData.id;
  console.log(childData);
 });
});

注销时,将以下命令添加到应用程序注销

Firebase.auth().signOut()