【问题标题】:Simple Firebase Rules简单的 Firebase 规则
【发布时间】:2016-02-15 18:11:52
【问题描述】:

这是我在 firebase 上的模型:

Texts
    -KAa-aU_RjZwM7FLQcWt
         id: "5f9fe424-4323-4370-a280-9cb216dc6410"
         text: "gregegreg"
    -KAa-bZC2ouIRQ54YWWr
          id: "5f9fe424-4323-4370-a280-9cb216dc6410"
          text: "gregegreg"

这些是我的规则:

"rules": {
  "Texts": {
      ".read": "auth.id === data.child('id').val()",
      ".write": true
   }

}

不幸的是,当我使用 5f9fe424-4323-4370-a280-9cb216dc6410 以外的另一个 UID 登录时,我仍然能够阅读我的所有模型文本

感谢您的任何想法!

身份验证部分适用于 angularJs 和登录密码:

var firebaseObj = new Firebase("https://blinding-heat-xxxx.firebaseio.com");
            $scope.authObj = $firebaseAuth(firebaseObj);

                $scope.login = function() {

                  $scope.authData = null;
                  $scope.error = null;

                  $scope.authObj.$authWithPassword({
                        email: $scope.email,
                        password: $scope.password
                    }).then(function(authData) {
                      console.log("Logged with id:", authData.uid);

                      $scope.loadData();

                    }).catch(function(error) {
                      console.error("Auth Failed :", error);
                      $scope.error = error;
                    });
                };

数据最终像这样加载到网页上:

$scope.loadData = function(){
var ref = new Firebase("https://blinding-heat-xxxx.firebaseio.com"); 
$scope.Texts = $firebaseArray(ref.child('Texts'));

}

在 HTML 中,angularJs 就在那里:

 <div ng-repeat="text in Texts">text.text</div>

真正奇怪的是下面的规则效果很好,例如:

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

}

【问题讨论】:

  • Firebase 工程师在这里我注意到了您的最后一次编辑。如果您担心有人入侵您的数据库,我建议您创建一个新数据库,将数据移过来并创建一个新数据库。作为一个额外的优势,您可以选择数据库的名称,而不是获取自动分配的名称。更容易记住。 :-)

标签: angularjs json firebase angularfire


【解决方案1】:

快到了!实际上是auth.uid 而不是auth.id

另外,您需要提供一个通配符,一个$ 变量,将规则应用于/Texts 之下的任何子级。

"rules": {
    "Texts": {
      "$text_id": {
        ".read": "auth.uid === data.child('id').val()",
        ".write": true
      }
    }
}

如果没有通配符,则将规则应用于/Texts 的静态路径。

这是模拟器中的输出。

【讨论】:

  • 感谢您的回答,是的,我已更改。但不幸的是,它仍然不起作用,它现在说“我不允许获取数据”,而我使用 5f9fe424-4323-4370-a280-9cb216dc6410 登录。也许我的 Firebase Json 语法不好?
  • 啊,我意识到你没有使用通配符,所以我更新了我的答案。
  • 谢谢,我是否必须在代码的另一部分提及通配符,因为我仍然收到错误:permission_denied: Client doesn't have permission to access the desired data, while i' m 使用 uid 5f9fe424-4323-4370-a280-9cb216dc6410 记录。只要我将规则更改为“.read”:“auth != null”,它就可以工作......但当然不是预期的。
  • 我在一个新的 Firebase 上测试了这个规则,它与你提供的 uid 和数据相同,所以它应该可以工作。您能否提供您的身份验证方式以及访问数据的方式?实际上,您应该使用仪表板中的模拟器来测试您的规则。
  • 好的,非常感谢您的建议和所有解决方案!它现在也适用于 Firebase 规则测试。最后,它似乎应该是一个 ng-repeat 类型的问题,或者关于我在身份验证后尝试获取数据的方式,但对我来说很难说。我不知道没有 ng-repeat 怎么办
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 2020-11-04
相关资源
最近更新 更多