【问题标题】:For firebase rules, why does permission get denied at uid level?对于 firebase 规则,为什么权限在 uid 级别被拒绝?
【发布时间】:2020-10-18 08:32:35
【问题描述】:

我在控制台中收到此错误

[Firebase/Database][I-RDB038012] /people/cQEVsQGXS3VJQzPBU4nL1HLx0Kq2 的侦听器失败:permission_denied

以下是我的规则。我知道错误可能出在 uid 上,因为我收到了控制台消息,但我不确定。我使用 firebase 文档试图弄清楚如何编写规则。

{
"rules": {
  "people" : {
    "$uid":  {
      "Education" :{
         ".read": "auth.uid != null" 
        ,".write": "$uid == auth.uid"
      }
      ,"Coordinates" : {
         ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }  
      ,"ForReUpload": {
         ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }
      ,"PhotoPosts": {
         ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }
        
      ,"WhatIamConsideringBuying":  { 
         ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }
      ,"caption": {
        ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }
      ,"peopleWhoLike" : {
        ".read": "$uid == auth.uid",
        ".write": "auth.uid != null"
      }
      ,"peopleWhoLike2" : {
         ".read": "auth.uid != null",
        ".write": "auth.uid != null"
      }
     
      ,"postID" : { 
         ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }
      ,"users" : {     
         ".read": "$uid == auth.uid",
       ".write": "$uid == auth.uid"  
      }
    }
  }
  }
}

这是我的数据库的 JSON:

"people" : {
"1ZWT7FAE2qThNQfBj7tbMO7BnMo1" : {
  "Coordinates" : {
    "latitude" : 50.054738,
    "longitude" : 8.226809826085624
  "peopleWhoLike2" : {
    "1vLVFwrXrHUoakmDrnQKwbv08Yj1" : 1581548952597,
    "F9NX0UCG4fVHCKFk2VZ1NZKsLro2" : 1586210112155,
    "IrrBgFY9C1ekMmHUkQRzc5LhbDu1" : 1581547417432,
    

触发查询:

    let thisUsersUid = Auth.auth().currentUser?.uid //Mr. Dunn's uid
    
    refArtists = Database.database().reference().child("people");
    
    refArtists.observe(DataEventType.value,  with: {snapshot in
        
        if snapshot.childrenCount>0{
            
            self.people.removeAll()
            
            for people in snapshot.children.allObjects as! [DataSnapshot] {
                
                    if people.key != thisUsersUid {
                        print("peoplekey",people.key)
                        

               
                    let peopleObject = people.value as? [String: AnyObject]
                    let peopleEducation = peopleObject?["Education"] as? String
                      let locCoord = CLLocation(latitude: lat, longitude: lon)
                      let distance = locCoord.distance(from: self.dict)
                            print(distance, "distancexy")




....
   self.people.append(peopl)
  .....

   self.people.sort { ($0.distance ?? 0) < ($1.distance ?? 0) }

           print("aaaaaaaa", self.people.map {$0.distance})
                
           self.table.reloadData()

            }
        }

【问题讨论】:

  • 请编辑问题以显示失败的查询,以及您希望它执行的操作。应该清楚您的查询如何与您的规则匹配。

标签: swift firebase firebase-realtime-database firebase-security


【解决方案1】:

您正在尝试从 /people/cQEVsQGXS3VJQzPBU4nL1HLx0Kq2 读取,但您的规则未授予任何人对该路径的读取权限。

我认为您正在寻找这些更简单的规则:

{
  "rules": {
    "people" : {
      "$uid":  {
        ".read": "auth.uid != null",
        ".write": "$uid == auth.uid"
      }
    }
  }
}

如果您只想允许某些子节点,您通常会为此使用验证规则。比如:

{
  "rules": {
    "people" : {
      "$uid":  {
        ".read": "auth.uid != null",
        ".write": "$uid == auth.uid",
        "Education" :{ ".validate": true },
        "Coordinates" : { ".validate": true },
        "ForReUpload": { ".validate": true },
        "PhotoPosts": { ".validate": true },
        "WhatIamConsideringBuying":  { ".validate": true },
        "caption": { ".validate": true },
        "peopleWhoLike" : { ".validate": true },
        "peopleWhoLike2" : { ".validate": true },     
        "postID" : { ".validate": true },
        "users" : { ".validate": true },
        "$other" : { ".validate": false },
      }
    }
  }
}

上面允许所有命名的子节点,但拒绝所有其他的(感谢$other 规则)。

【讨论】:

  • 谢谢。但是像 PeopleWhoLike PeopleWhoLike2 这样的 Childs 呢?他们需要对其他用户的写入能力。您答案中的最后一个设置不会只授予当前登录用户的写入权限(“$uid == auth.uid”)吗?
  • 啊,如果您需要对其中一个节点进行更广泛的访问,您仍然可以在我在这里提出的更改之后执行此操作。但是您发布的错误消息来自尝试读取没有人可以访问的节点,这是我试图在回答中解释的内容。
  • @Frank van Puffelen 谢谢。几天前我尝试了顶级的,我记得它拒绝了Childs,因为人们没有规则。这也是我理解您的回答的方式,即规则不授予人们访问权限。该问题也适用于第二个示例。在第二个例子中,他们是否会像受教育一样获得 Childs 的教育,因为 uid 和 people 没有规则(就像我最初的尝试)
  • 这些规则允许访问/people/$uid,因此已知用户的任何用户特定节点。这是否适合你取决于你试图从哪里读取,你没有显示(道格在 cmets btw 中询问了该代码)。如果您尝试读取所有 /people,则需要在此处定义 .read 规则以授予访问权限。
  • 谢谢。我的错。我错过了道格的评论。我刚刚添加了一个触发查询。其他更具体,例如孩子的快照,而不是人的快照。示例中的一个是以人结尾的快照(即没有Childs),因为需要多个Childs 来追加和重新加载。
猜你喜欢
  • 1970-01-01
  • 2020-08-16
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多