客户无权访问 Firebase 中的所需数据

Posted

技术标签:

【中文标题】客户无权访问 Firebase 中的所需数据【英文标题】:Client doesn't have permission to access the desired data in Firebase 【发布时间】:2017-02-12 11:46:50 【问题描述】:

我有一个页面正在调用控制器内部的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.

这就是我想要实现的目标-

【问题讨论】:

请将您的 Firebase 规则添加到您的问题中。这些实际上导致了权限被拒绝错误。 除了给出规则。您在问题中包含了 JSON 树的图片。请将其替换为实际的 JSON 作为文本,您可以通过单击 Firebase 数据库控制台中的导出按钮轻松获取该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 "rules": ".read": true, ".write": true @AndréKool 【参考方案1】:

转到您应用的 Firebase 控制台

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


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

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

【讨论】:

虽然这将消除错误,但它会使数据库对全世界都可读和可写。如果您在提出此建议时包含这样的警告,那就太好了。 错误消失了。但仍然没有任何东西存储在数据库中。 @ujjwal @Akash 您正在使用 add 功能,而不是您应该使用 update .. 在您的这种情况下 .. 这是多路径更新 但是firebaseArray文档中没有update这样的方法。 @Ujjwalkaushik 如果其他人感到困惑(或者可能只是凌晨 2 点......),Firebase 的“实时数据库”和新的“Cloud Firestore [Beta]”服务是具有不同 API 的完全独立的实体。可以在 here 找到“Cloud Firestore”的等效规则。在我的情况下,我已经正确配置了这个,但是我试图使用没有调整相应规则的“实时数据库”API。【参考方案2】:

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


希望有所帮助!

【讨论】:

感谢您的帮助 /* 访问firebase.google.com/docs/database/security 了解有关安全规则的更多信息。 */ "rules": ".read": true, ".write": true "Firebase 项目默认以 Firestore 作为数据库开始。"如果您直接链接到数据库 url 示例,则不适用:databaseURL: "project-xyz.firebaseio.com",【参考方案3】:

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

当然,您需要使用 firebase 身份验证功能来使用这些规则,但应该默认阻止匿名的写访问。以下规则为所有人提供读取权限,同时保持安全性。


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

【讨论】:

【参考方案4】:

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

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

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


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

【讨论】:

【参考方案5】:

为了向所有经过身份验证的用户授予访问权限,请转到 firebase 网络控制台中的数据库规则选项卡并复制/粘贴以下规则:


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

【讨论】:

【参考方案6】:

请使用以下代码在 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()

【讨论】:

【参考方案7】:

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

【讨论】:

这是错误的,users 没什么特别的【参考方案8】:

希望对你有帮助。


    ".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"

结果是一样的。

【讨论】:

【参考方案9】:

如果有人在允许正确的读取权限后仍然获得Error: permission_denied,并且正在使用某种 firebase npm 包获取数据;这可能是因为您尝试从实时数据库而不是 Cloud Firestore 中读取数据。

我使用react-redux-firebase npm 包进行快速简便的设置。默认情况下,它使用实时数据库。如果您使用 Cloud Firestore,则需要在配置中声明,将 useFirestoreForProfile 设置为 true

import  ReactReduxFirebaseProvider  from 'react-redux-firebase';

const store = configureStore();
const rrfProps = 
  firebase,
  config:  
    userProfile: 'users', 
    useFirestoreForProfile: true  // Firestore for Profile instead of Realtime DB
  ,
  dispatch: store.dispatch,
  createFirestoreInstance,
;

可能与其他 firebase 软件包类似的问题,例如支持实时数据库但不支持 Cloud Firestore 的火焰链接,如 this issue 中所述。

【讨论】:

以上是关于客户无权访问 Firebase 中的所需数据的主要内容,如果未能解决你的问题,请参考以下文章

Fire Storage Exception([firebase_storage/unauthorized] 用户无权执行所需的操作。)(我的规则是允许读/写)

从服务器接收对象并将其转换为客户端Typescript(javascript)中的所需对象[重复]

Firebase 客户端无权执行此操作

Firebase 错误:用户无权访问

用户无权访问此对象。 Firebase 存储安卓

Firebase 云功能“您的客户端无权从此服务器获取 URL /200”