【发布时间】:2017-01-03 04:34:00
【问题描述】:
我在我的 iOS 应用中使用 Firebase。我希望我的每个对象都有一个 creatorId 属性,其值是经过身份验证的用户 ID(authData.uid 带有 Firebase 身份验证对象)。我正在使用自定义令牌生成器进行身份验证,但问题也可以通过匿名登录来重现。
我希望用户只能读取(和写入,但现在让我们专注于阅读,因为那是我遇到问题的地方)他们创建的对象。换句话说,查询用户的认证用户 ID 将匹配他们正在获取的对象的creatorId。
当我制定查询和规则来实现这一点时,我遇到了权限问题。
Here 是 Firebase 的规则和安全文档。
这是我的 Firebase 仪表板对于 Task 对象的外观:
+ firebase-base
+ tasks
+ {task_id}
+ creatorId:
+ title:
其中task_id 是 Firebase 在插入时生成的唯一标识符。
我的规则是这样的(同样,让我们暂时忽略编写规则):
{
"rules": {
"tasks": {
"$task_id": {
".read": "auth.uid === data.child('creatorId').val()"
}
}
}
}
读取特定任务可以正常工作,但我希望能够使用observeEventType 和相关函数进行查询“获取我创建的所有任务”。这对我不起作用。我收到“权限被拒绝”错误。
这是我在 Swift 中的观察方式:
let reference = Firebase(url: "https://{My-Firebase-Base-Reference}/tasks")
reference.observeEventType(.ChildChanged,
withBlock: { (snapshot: FDataSnapshot!) -> Void in
// Success
}) { (error: NSError!) in
// Error: I get Permissions Denied here.
}
根据@Ymmanuel 的建议,我还尝试在查询中更加具体,如下所示:
let reference = Firebase(url: "https://{My-Firebase-Base-Reference}/tasks")
reference.queryOrderedByChild("creatorId").queryEqualTo({USER_UID}).observeEventType(.ChildChanged,
withBlock: { (snapshot: FDataSnapshot!) -> Void in
// Success
}) { (error: NSError!) in
// Error: I get Permissions Denied here.
}
这些块都不起作用,我总是收到“权限被拒绝”错误。我做错了什么?
【问题讨论】:
-
我有一个问题?使用您作为“用户 A”的规则,您可以为“用户 B”创建任务,只要您在 creatorId 中设置“用户 B”uid 对吗?
-
你的输出是什么?您的孩子添加的事件完全被解雇了吗?或不?有时是成功有时你会被拒绝??
-
我发表了一些部分想法,但问题确实不清楚。你到底想做什么?如果通过 .ChildChanged 观察到现有节点,则如果该节点发生更改,则会向您的应用发送事件。如果只应通知用户某些节点的更改,您只需将观察者附加到这些节点。这种能力不需要任何规则。如果您想禁止读取将使用规则完成的节点。你能澄清你的后事吗?也许是一个用例?
-
@Jay 很抱歉造成混乱。我编辑了这个问题,希望能提高清晰度。让我知道这是否有帮助。
-
规则不能用于过滤数据。请参阅stackoverflow.com/a/14298525/209103 以获得最佳解释。正如 Jay 所说:
ChildChanged只会在现有孩子发生变化时触发,您更有可能在寻找ChildAdded。但除非你解决“规则不是过滤器”的要求,否则什么都行不通。