Javascript 基于用户锁定特定节点的读/写访问

Javascript 基于用户锁定特定节点的读/写访问,javascript,firebase,firebase-security,emberfire,Javascript,Firebase,Firebase Security,Emberfire,我知道我也遇到过类似的问题,但我仍然有点困惑于如何妥善保护我的Firebase 首先,我用的是灰烬火。其次,我使用Firebase电子邮件/密码身份验证进行帐户管理。我的每个账户代表一个企业。我希望当前经过身份验证的企业只能访问其数据。最初,我的想法是使用以下数据结构: + businesses - uid-1 - uid-2 - uid-3 …其中uid是通过Firebase电子邮件/密码身份验证分配给用户的内容。然后,我将使用以下安全规则: { "rules":

我知道我也遇到过类似的问题,但我仍然有点困惑于如何妥善保护我的Firebase

首先,我用的是灰烬火。其次,我使用Firebase电子邮件/密码身份验证进行帐户管理。我的每个账户代表一个企业。我希望当前经过身份验证的企业只能访问其数据。最初,我的想法是使用以下数据结构:

+ businesses
    - uid-1
    - uid-2
    - uid-3
…其中uid是通过Firebase电子邮件/密码身份验证分配给用户的内容。然后,我将使用以下安全规则:

{
  "rules": {
    "businesses": {
      "$user_id": {
        ".read": "$user_id === auth.uid",
        ".write": "$user_id === auth.uid"
      }
    }
  }
}
综上所述,有两个问题:

  • 行吗?(相当肯定会基于此)
  • 如果是这样,我如何让EmberFire允许我使用自己的id,而不是由
    push()
    生成的id,根据文档,EmberFire在引擎盖下使用该id
  • 更新 关于EmberFire,以下是我用来将模型保存到Firebase的代码:

    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);
    });
    
    我看到的是,这些创建对象的根节点最终是Firebase生成的唯一时间戳ID。为了解决我的问题,我想将其覆盖到auth.uid

    提前谢谢!
    James

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

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

    在创建用户记录之前,您可能需要确保它不存在,因此您需要一个“查找或创建”流。在余烬数据中执行这种流时存在一些问题。评论中概述了一个解决方法示例

    谢谢,弗兰克。我更新了我原来的帖子,显示了我用来保存到Firebase的与灰烬火相关的代码。如前所述,这些对象的根注释最终是由引擎盖下的
    push()
    生成的Firebase ID,因此问题是:我是否可以覆盖它,以便使用auth.uid作为我保存内容的根节点?@FrankvanPuffelen,下面的解决方案解决了我的余火问题,但我仍然无法获得使用上述模式正常工作的许可。下面是一个JS bin,它说明了我正在尝试做的事情:。再次感谢所有的帮助。@FrankvanPuffelen这些问题是相关的。如果我上面提到的提议的安全规则不起作用,我不会担心需要在EmberFire中重写密钥。仅供参考,作为对您第一次回复的回应,我最初确实尝试了这些规则,但遇到了问题,这就是为什么我首先发布这些规则的原因。也就是说,如果你不想帮忙,那没关系,只是不要回答。这比你的冷嘲热讽的回答要好。嗯,那太简单了。非常感谢你!我会检查一下解决方法。再次感谢你的帮助!跟进:虽然您上面提到的
    id
    修复程序对EmberFire问题有效,但我在尝试使用上面提到的安全规则写入
    business/$user\u id
    时遇到了
    permission\u denied
    错误。有什么建议吗?谢谢