【发布时间】:2019-09-18 08:36:02
【问题描述】:
我制作了一个具有协作功能的笔记式应用程序,并希望设置安全的安全规则。 问题是:我的安全规则不适用于我的数据库查询。 当我测试经过身份验证的用户对笔记的访问权限时,Firebase 安全规则模拟器显示正确的结果。 但在应用程序中,我收到消息“/notes 的侦听器失败:permission_denied”。
我在这里找到了一些很好的安全规则示例 Firebase: Security rules for a collaborative app 和这里 https://gist.github.com/katowulf/4741111 但这些与我所拥有的并没有什么不同。 我怀疑问题可能出在查询中或缺少索引规则(“.indexOn”)。
我的查询是:
- (void)setupQuery {
NSString *email = [FirebaseAuthorization shared].currentUserEmail;
self.reference = [[[FIRDatabase database] reference] child:@"notes"];
NSString *query = [NSString stringWithFormat:@"document/users/%@", email.MD5String];
self.query = [[self.reference queryOrderedByChild:query] queryEqualToValue:@(YES)];
}
我的安全规则是:
{
"rules": {
"notes" : {
"$note_id" : {
".read": "data.child('document/users/'+root.child('users/'+auth.uid+'/email_md5').val()).val() === true",
".write": "(data.child('document/users/'+root.child('users/'+auth.uid+'/email_md5').val()).val() === true) || (root.child('users/'+auth.uid+'/email').val() === root.child('users/'+newData.child('document/author').val()+'/email').val())",
".indexOn": "document/users"
}
},
"users" : {
"$user_id" : {
".read": "auth.uid === $user_id",
".write": " ( auth.uid == newData.val() ) || ( auth.uid == $user_id )"
}
}
}
}
而我的数据库结构是:
{
"notes" : {
"NOTE_ID_1" : {
"document" : {
"author" : "user_id_1",
"users" : {
"email_1_md5@email-com" : true,
"email_2_md5@email-com" : true
}
}
}
"NOTE_ID_2" : {
"document" : {
"author" : "user_id_2",
"users" : {
"email_3_md5@email-com" : true,
"email_4_md5@email-com" : true,
}
}
}
}
"users" : {
"iser_id_1" : {
"email" : "email_1@email.com",
"email_md5" : "email_2_md5@email-com"
}
}
}
我希望查询能够使用严格的安全规则(每个用户只能访问他的笔记),但现在它只能使用宽松的安全规则(每个用户都可以访问所有笔记)。
【问题讨论】:
标签: objective-c firebase firebase-realtime-database firebase-authentication firebase-security