Правила безопасности Firebase, возвращающие разрешение, отклоненное при попытке записи в базу данных

Я делаю приложение, которое создает процессы для команд для завершения. В этих процессах есть участники, которые являются администраторами, которые могут писать им, а затем просто обычными пользователями, которые могут их читать. Когда пользователь создает процесс в первый раз, он становится администратором по умолчанию. Однако всякий раз, когда я пытаюсь создать процесс, я получаю "отказ в разрешении" от Firebase и не могу. У меня по существу одно и то же правило для чтения (просто заменив путь "users" на путь "admins"), и я могу читать процессы очень хорошо. Просто не в состоянии их сделать. Есть идеи, почему это происходит.

Вот правила безопасности для процессов:

"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' })

1 ответ

Вы должны отделиться data.child('users/' + auth.uid) в 2 разных .child() заявления. Так что-то вроде этого: data.child('users').child(auth.uid),

Другие вопросы по тегам