gpt4 book ai didi

ios - 具有事件观察的 Firebase 对象所有权

转载 作者:可可西里 更新时间:2023-11-01 05:40:20 25 4
gpt4 key购买 nike

我在我的 iOS 应用中使用 Firebase。我希望我的每个对象都有一个 creatorId 属性,其值为经过身份验证的用户 ID(authData.uid 带有 Firebase 身份验证对象)。我正在使用自定义 token 生成器进行身份验证,但匿名登录也可以重现该问题。

我希望用户只能读取(和写入,但现在让我们专注于读取,因为这是我遇到问题的地方)他们创建的对象。换句话说,查询用户的经过身份验证的用户 ID 将与他们正在获取的对象的 creatorId 相匹配。

当我设计查询和规则来实现这一点时,我遇到了权限方面的问题。

Here是规则和安全的 Firebase 文档。

对于 Task 对象,我的 Firebase 仪表板如下所示:

+ 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.

}

这些 block 都不起作用,我总是收到“权限被拒绝”错误。我做错了什么?

最佳答案

您缺少的是您假设安全规则是查询,但事实并非如此。

检查 Rules are Not Filters链接中的部分。

安全规则仅在您可以读取或写入 Firebase 数据库的特定路径时才有效。

如果您只想接收特定用户的更改,您应该使用 firebase 查询。

例如,如果你想获取特定用户的所有任务,你应该这样做:

let reference = Firebase(url: "https://{My-Firebase-Base-Reference}/tasks")
reference.queryOrderedByChild("creatorId").queryEqualTo(YOUR_CURRENT_USER_UID).observeEventType(.ChildChanged,
withBlock: { (snapshot: FDataSnapshot!) -> Void in
// Success
}) { (error: NSError!) in
// Error: Get Permissions Denied Here.
}

这样您就可以获得仅与您的用户相关的所有事件,并通过应用安全规则来保护信息。

此外,如果您只想允许创建者编写自己的任务,您还应该考虑创建任务并编写如下内容的情况:

  "tasks": {
//You need to include the $task_id otherwise the rule will seek the creatorId child inside task and not inside your auto-generated task
"$task_id": {
".read": "auth.uid === data.child('creatorId').val()",
//this is to validate that if you are creating a task it must have your own uid in the creatorId field and that you can only edit tasks that are yours...
".write":"(newData.child('creatorId').val() === auth.uid && !data.exists()) || (data.child('creatorId').val() === auth.uid && data.exists())",
//you should add the index on to tell firebase this is a query index so your queries can be efficient even with larger amounts of children
".indexOn":"creatorId",
}
}

(检查语法,但这是一般的想法)

关于ios - 具有事件观察的 Firebase 对象所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37470879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com