当前位置: 首页 > 知识库问答 >
问题:

Firebase实时数据库和Xcode:允许每个用户读取自己的数据,而不是所有的数据

柯振濂
2023-03-14
let userID = Auth.auth().currentUser!.uid
ref = Database.database().reference().child(userID);

首先,这里是我的消防规则:

  {
  "rules": {
    "jobs": {
      "$uid": {
        ".read": "auth.uid === $uid"
      }
    }
  }
}

以下是我的firebase数据库:

FirebaseDatabase

import UIKit
import Firebase
import FirebaseAuth

class LoginViewController: UIViewController {

    var ref: DatabaseReference!

    static var isAlreadyLaunchedOnce = false

    @IBOutlet weak var txtemail: UITextField!

    @IBOutlet weak var txtpass: UITextField!


    var isSignin:Bool = true

    override func viewDidLoad() {
        super.viewDidLoad()

       if FirebaseApp.app() == nil {
        FirebaseApp.configure()
       }
    }


    @IBAction func submit(_ sender: UIButton) {

        if let email = txtemail.text, let passowrd = txtpass.text

        { Auth.auth().signIn(withEmail: email, password: passowrd) { (user, error) in
                if user != nil {
                    self.performSegue(withIdentifier: "goto", sender : self)
                }
                else {
                    let alert = UIAlertController(title: "Username or Password Incorrect", message: nil, preferredStyle: .alert)
                    let okButton = UIAlertAction(title: "Ok", style: .default, handler: nil)
                    alert.addAction(okButton)
                    self.present(alert, animated: true, completion: nil)
                }
            }
        }
}
}
import UIKit
import Firebase

class LoggedInViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {


    @IBOutlet weak var loginlbl: UILabel!

    @IBOutlet weak var tbl: UITableView!

    var ref: DatabaseReference!
    var jobList = [JobModel]()

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let job = jobList[indexPath.row]

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ViewControllerTableViewCell

        let job: JobModel

        job = jobList[indexPath.row]

        cell.lblCol.text = job.collection
        cell.lblDel.text = job.delivery
       cell.lblShip.text = job.shipper
        cell.lblCon.text = job.consignee
       cell.lblEmai.text = job.email
       cell.lblRef.text = job.reference
       cell.lblFreight.text = job.freight
       cell.collected.text = job.collected
       cell.delivered.text = job.delievered

        return cell  }


func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return jobList.count
}

override func viewDidLoad() {

        super.viewDidLoad()

if FirebaseApp.app() == nil {
FirebaseApp.configure()     }


ref = Database.database().reference().child("jobs");

ref.observe(DataEventType.value) { (snapshot) in

if snapshot.childrenCount>0 {

self.jobList.removeAll()

for jobs in snapshot.children.allObjects as! [DataSnapshot]{
    let jobObject = jobs.value as? [String: AnyObject]
    let jobId = jobObject?["id"]
    let jobShipper = jobObject?["shipper"]
    let jobConsignee = jobObject?["consignee"]
    let jobEmail = jobObject?["email"]
    let jobReference = jobObject?["reference"]
    let jobFreight = jobObject?["freight"]
    let jobCollection = jobObject?["collection date"]
    let jobDelivery = jobObject?["delivery date"]
    let jobPod = jobObject?["pod"]
    let jobCollected = jobObject?["collected"]
    let jobDelivered = jobObject?["delivered"]

    let job = JobModel(id: jobId as! String?,
            shipper: jobShipper as! String?,
            consignee: jobConsignee as! String?,
            email: jobEmail as! String?,
            reference: jobReference as! String?,
            freight: jobFreight as! String?,
            collection: jobCollection as! String?,
            delivery: jobDelivery as! String?,
            pod: jobPod as! String?,
            collected: jobCollected as! String?,
            delivered: jobDelivered as! String?)

            self.jobList.append(job)
}
            self.tbl.reloadData()
} } }


override func viewDidAppear(_ animated: Bool) {

    Auth.auth().currentUser != nil; do {

        self.loginlbl.text = "Hello " + (Auth.auth().currentUser?.email)!


    }}



}

共有1个答案

长孙永思
2023-03-14

您的规则允许您访问作业的子节点。喜欢jobs/user_id_1

因此,您必须监听子节点,而不是整个作业节点

database.database().reference().child(“jobs”);

 类似资料:
  • Firebase实时数据库似乎会在添加或删除新项目等时通知我。这很好,但如何获取之前通知我的所有现有项目? 例如,假设我的应用程序列出了数据库中的项目。我第一次启动了我的应用程序。然后创建了“项目1”和“项目2”。Firebase通知我“项目1”和“项目2”,因此我将它们添加到我的应用程序列表中。 现在,我的应用程序已关闭并重新启动。如果创建了新项目“项目3”,我会收到通知,但如何再次检索“项目1

  • 我遇到的问题是,使用下面显示的以下Firebase规则,经过身份验证的用户可以成功写入数据库,但无法从中读取,因为我在控制台中获得了“拒绝权限”。当我将读取和写入设置为true(公共)时,读取和写入功能都正常工作。我从数据库中读取的代码也显示如下: 规则: 示例数据库: 以下是确切的错误:

  • 我已经花了几个小时阅读产品分支中的0和1。请在Firebase数据库有经验的人帮助我:(

  • 我正在使用FireBase实时数据库来设置一个简单的CRUD应用程序。 我正在设置规则,以便只有登录的用户才能写入请求部分。我一定是误会了奥特。uid。 在请求中,我设置了,但我无法写入数据。 我错过了什么?

  • 我的nextjs webapp中有一个实时数据库,我用它来发送通知。 我的数据库的架构如下: 我仅以管理员身份从服务器端写入数据,但按以下方式从客户端读取数据: 在这一刻,我有以下规则: 正如您所看到的,每个经过身份验证的人都可以阅读所有内容。我希望用户只阅读他自己的通知。ObjectID是我的mongoDB中的引用。 例如,如果我的我只想访问路径的数据,如果我试图从,那么我什么也得不到(或错误)

  • 我正在一个聊天应用程序,其中消息存储在firebase实时数据库。现在,如果我创建一个如下所示的节点(Chats-Better-A-ID和-B-ID是自动生成的聊天室密钥),那么我想知道当用户S在聊天应用程序中打开与用户T聊天时,so数据库将只读取存储在Chats-Better-S-T-ID中的消息,而不会读取其他聊天室消息!?我说的对吗?如果是,那么它会降低定价吗? 或 如果我存储如下所示的数据