【问题标题】:Firebase security rules returning permission denied when trying to write to database尝试写入数据库时​​,Firebase 安全规则返回权限被拒绝
【发布时间】:2016-09-01 16:14:50
【问题描述】:

我正在制作一个应用程序,它为团队创建流程来完成。这些进程的成员是可以写信给它们的管理员,然后是可以阅读它们的普通用户。当用户第一次创建进程时,默认情况下他们被设为管理员。但是,每当我尝试创建一个进程时,我都会从 Firebase 获得“权限被拒绝”,而我无法做到。我有基本相同的阅读规则(只是用“管理员”路径替换“用户”路径)并且我能够很好地阅读这些过程。只是无法制造它们。任何想法为什么会发生这种情况。

以下是进程的安全规则:

"processes": {
        "$processID": {
          ".read": "auth.uid != null && data.child('users/' + auth.uid).val() === true",
          ".write": "auth.uid != null && newData.child('admins/' + auth.uid).val() === true"
        }
      }

这是进程的数据结构:

processes
 -KQ_j5Yt75GktE5pBRFS
   admins
      HESy7LE7JbeNyHKaGeyWRhNIuE83: true
   createdOn: "2016-09-01T04:00:00.000Z"
   description: "This is an example process"
   name: "Example Personal Process"
   tasks
   team: "-KQ_iwUmXsx0zasoPxT9"
   users
      HESy7LE7JbeNyHKaGeyWRhNIuE83: true

这是我创建进程的函数:

actions: {
        createProcess(processName, processDescription) {
        var teamId = this.controllerFor('processes/new').get('teamId');
        var self = this;
        console.log("team: "+teamId);
        let currentUser = this.get('user').get('currentUser');
        let team = this.get('store').peekRecord('team', teamId);
        let user = this.get('store').peekRecord('user', currentUser.id);
        console.log("user "+currentUser.id)
        let process = this.get('store').createRecord('process', {
            team: team,
            user: user,
            admin: user,
            name: processName,
            description: processDescription
        });
        user.get('processes').pushObject(process);
        user.get('processesLead').pushObject(process);
        team.get('processes').pushObject(process);
        console.log("about to save process");
        process.save().then(function () {
        console.log(process.admin.id);
        user.save();
        console.log("user saved");
        team.save();
        console.log("team saved");
    }).then(() => this.transitionTo('team', teamId));
       }

这是我的用户模型的一部分。

processes: DS.hasMany('process'),
  tasks: DS.hasMany('task'),
  processesLead: DS.hasMany('process', { inverse: 'admins' }),
  teamsLead: DS.hasMany('team', { inverse: 'admins' }),
  tasksLead: DS.hasMany('task', { inverse: 'admins' }),
  processMember: DS.hasMany('process', { inverse: 'members' }),
  teamMember: DS.hasMany('team', { inverse: 'members' }),
  taskMember: DS.hasMany('task', { inverse: 'members' })

这是我的流程模型的一部分:

 users: DS.hasMany('user'),   
    admins: DS.hasMany('user', { inverse: 'processesLead' }),
    members: DS.hasMany('user', { inverse: 'processMember' })

【问题讨论】:

  • 显示代码,您写入数据库的位置
  • 看在上帝的份上,用 UNIX 时间戳替换日期/时间字符串
  • 刚刚添加的代码。 @DimaRostopira
  • 等等,这是什么语言? 0_o JS?
  • 是的,JS。我使用 Ember 作为框架。 @DimaRostopira

标签: firebase firebase-realtime-database firebase-security


【解决方案1】:

您必须将 data.child('users/' + auth.uid) 分成 2 个不同的 .child() 语句。所以像这样:data.child('users').child(auth.uid).

【讨论】:

  • 所以我只是尝试过,但仍然有同样的问题。我能够读取进程,但仍然无法写入它们。知道为什么吗?这与我使用 newData 进行写作有关吗?
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2020-03-22
相关资源
最近更新 更多