0

在这里,我使用 angularFire 获取数据:

angular.module('FireApp', ['firebase'])
  .controller('Document', function($scope, $routeParams, angularFire){
    var url = "https://my-account.firebaseio.com/test" + "/" + $routeParams.data;
    angularFire(url, $scope, data);
});

问题是这将加载“ https://my-account.firebaseio.com/test/data ”及其所有子孙等。
“/data”是一个对象数组,它可以(但是不必——它很可能是一个字符串数组)看起来类似于“/data”的父级:

data: ["0" : {
    "data" : [...],
    "meta" : {
      "active" : false
    },
    "sign" : [...]
  },
  "1" : {
    "data" : [...],
    "meta" : {
      "active" : true
    },
    "sign" : {...}
  },
  "2" : {
    "data" : [...],
    "meta" : {
      "active" : false
    },
    "sign" : {...}
  }]

基本上,我希望所有未经身份验证的 angularFire 客户端仅接收数据数组的那些元素,其中布尔标志 meta.active = true,即活动标志需要决定,而其祖父母将根据 angularFire 请求发送给客户端。未经身份验证的客户端也无法写入/编辑任何数据。我要设置的规则应该说:“只要设置了'active = false'标志,就不要将标志的祖父母发送给angularFire客户端,除非客户端经过身份验证。”。所以是的,规则需要是相对的而不是绝对的。
只有经过身份验证的客户端才能接收/编辑所有数据。
我可以使用 Firebase 简单登录和安全规则制定此类规则吗?
如果祖父母无法做到这一点,则可以将“活动”标志向上移动一级以影响其父母。
谢谢你的时间,
贾里德

4

1 回答 1

1

您需要重组数据才能使用 Firebase 实现这一目标。有关这方面的一些背景信息,请参阅此博客文章:https ://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

构造数据的一种方法是创建两个单独的列表,一个用于活动项目,另一个用于非活动项目。当某个项目变为活动或不活动时,请务必将其从一个列表中删除并放入另一个列表中。

{
  "active": {
    0: {
      "data": {...},
      "sign": {...}
    }
  },
  "inactive": {
    0: {
      "data": {...},
      "sign": {...}
    }
  }
}

在您的安全规则中,您可以简单地阻止未经身份验证的用户访问非活动项目:

{
  "rules": {
    "active": {
      ".read": true
    },
    "inactive": {
      ".read": "auth != null"
    }
  }
}

希望这可以帮助!

于 2013-08-21T17:11:44.720 回答