根据用户锁定特定节点的读/写访问权限

时间:2015-04-17 07:38:02

标签: javascript firebase firebase-security emberfire

我知道我遇到了类似的问题,但我仍然对如何正确保护我的Firebase感到有点困惑。

首先,我使用的是EmberFire。其次,我使用Firebase电子邮件/密码身份验证进行帐户管理。我的每个帐户都代表一项业务。我喜欢它,以便当前经过身份验证的企业只能访问他/她的数据。最初,我的想法是使用以下数据结构:

+ businesses
    - uid-1
    - uid-2
    - uid-3

...其中uid是通过Firebase电子邮件/密码身份验证分配给用户的内容。然后我会使用以下安全规则:

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

尽管如此,还有两个问题:

  1. 会起作用吗? (很确定它将基于this post
  2. 如果是这样,我怎样才能让EmberFire允许我使用我自己的id而不是push()生成的内容,EmberFire根据文档使用了var business = _this.store.createRecord('business', { uid: userData.uid, businessName: _this.get('businessName'), firstName: _this.get('firstName'), lastName: _this.get('lastName') }); business.save().then(function(success) { flashMessages.success('Your account has been created! Please login below.'); _this.transitionToRoute('login'); }, function(error) { flashMessages.warning(error); });
  3. 更新 关于EmberFire,这里是我用来将模型保存到Firebase的代码:

    {{1}}

    我所看到的是,这些创建的对象的根节点最终成为Firebase生成的唯一时间戳ID。为了解决我的问题,我想将其覆盖到auth.uid。

    提前致谢! 詹姆斯

1 个答案:

答案 0 :(得分:2)

您可以在执行id时指定createRecordid将成为firebase

var record = this.store.createRecord('business', {
  id: userData.uid,
  businessName: this.get('businessName'),
  firstName: this.get('firstName'),
  lastName: this.get('lastName')
});

您可能希望确保用户记录在创建之前不存在,因此您需要找到或创建"查找或创建"流。在Ember Data中进行这种流程时有一些问题。评论here

中概述了一个示例解决方法