gpt4 book ai didi

ios - Swift Firebase 规则权限在observeSingleEvent 时被拒绝

转载 作者:行者123 更新时间:2023-11-30 11:15:48 25 4
gpt4 key购买 nike

我正在开发一款应用程序,允许教师录制学生的类(class)。使用 Firebase 规则 我想允许教师访问某些学校。我有以下规则:

{
"rules": {
"Schools" : {
"$schoolId" : {
".read" : "data.child('Teachers').hasChild(auth.uid)",
".write" : "data.child('Teachers').hasChild(auth.uid) ||
root.child('User').child(auth.uid).child('Invitation').exists()"
}
},
"Users" : {
"$uid" : {
".read" : "auth.uid === $uid",
".write": "auth.uid === $uid"
}
}
}
}

在模拟器中一切正常,但是当触发以下所有权限时,所有学校都会被拒绝。

DataService.ds.REF_SCHOOLS.observeSingleEvent(of: .value) { (snapshot) in
MySchools.mySchoolKeyList.removeAll()
MySchools.mySchoolList.removeAll()
if let snapshot = snapshot.children.allObjects as? [DataSnapshot] {
for snap in snapshot {
if let recordDict = snap.value as? Dictionary<String, AnyObject> {
if let name = (recordDict["SchoolName"] as? String) {
MySchools.mySchoolList.append(name)
}
MySchools.mySchoolKeyList.append(snap.key)
}
}
if MySchools.mySchoolList.isEmpty {
MySchools.mySchoolList.append("You do not belong to any schools.")
}
}
}

以下是 Firebase 数据库的快照供引用:

enter image description here

有人知道我的规则有什么问题吗?另外,如何处理权限被拒绝的结果将不胜感激。

最佳答案

您的代码正在尝试从 /Schools 读取数据,但您的规则未授予任何人从 /Schools 读取数据的权限。因此 Firebase 正确地拒绝读取。

我有一种感觉,您希望读取操作自动过滤结果以仅返回用户有权访问的学校节点 (/Schools/$schoolId)。但这不是 Firebase 安全规则的工作方式:rules cannot be used to filter data

对于开始使用 Firebase 的服务器端安全规则的开发人员来说,这是一个常见的混淆来源,因此我建议您查看之前的一些内容 questions mentioning "rules are not filters" .

<小时/>

现在一种获取过滤数据的方法,而无需授予用户访问所有学校的权限。为此,您需要:

  1. 使用查询仅请求您应该有权访问的学校。
  2. 验证您的安全规则中的 /Schools 是否允许此查询。

有关此示例,请参阅 query based rules在文档中。

代码应该是这样的:

let query = DataService.ds.REF_SCHOOLS.queryOrdered(byChild: "Teachers/"+uid).queryValue(equalTo: true);
query.observeSingleEvent(of: .value) { (snapshot) in
...

但这样做的问题是您需要为每个老师定义一个索引。虽然这在技术上是可行的,但会导致索引数量不合理。

<小时/>

事后看来:您当前的数据结构可以让您有效地找到特定学校的教师。但是,它无法让您有效地找到特定教师的学校。

为了有效地查找特定教师的学校,请在数据库中添加一个额外的数据结构,将学校映射到每位教师。例如

teacherSchools
teacherUid1
schoolId1: true
schoolId2: true
teacherUid2
schoolId2: true
schoolId3: true

使用此结构,您可以轻松读取教师的所有学校 ID,然后加载每个学校。此加载速度比大多数开发人员预期的要快得多,因为 Firebase pipelines the requests over a single connection .

有关此方法的更长/其他解释,请参阅 Firebase query if child of child contains a valueFirebase Query Double Nested .

关于ios - Swift Firebase 规则权限在observeSingleEvent 时被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51765677/

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