Правила безопасности 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)
,