2016-11-11 3 views
0

Dies ist mein Ansatz, um bestimmten Benutzern den Zugriff auf ihr zugewiesenes "Shop" -Objekt zu ermöglichen.Firebase: Zugriff auf verschiedene Bereiche je nach Benutzer

func shopFetch() { 

     self.shop.removeAll() 
     let shopRef = FIRDatabase.database().reference().child("shop").child(someIDforShop).child("menu") 
     shopRef.observe(.childAdded, with: { (snapshot) in 

      if let dictionary = snapshot.value as? [String: AnyObject] { 

       let something1 = dictionary["some1"] 
       let something2 = dictionary["some2"] 

       let shopper = Shop(some1: something1, some2: something2) 
       self.shop.insert(shopper, at: 0) 

       self.collection.reloadData() 
      } 

      }, withCancel: nil) 

    } 

Das sind meine Sicherheitsregeln

rules: { 
    "users": { 
    "$uid": { 
     ".read": "auth != null || auth.uid == $uid", 
     ".write": "auth != null && auth.uid == $uid", 
     "$yourShop": { 
      ".read": "true" 
    } 
    }, 

    "shop": { 
    "$yourShop": { 
     ".read": "root.child('users').child(auth.uid).child($yourShop).val() == true", 
     ".write": "root.child('users').child(auth.uid).child($yourShopManager).val() == true || root.child('users').child(auth.uid).child('isAdmin').val() == true" 
     } 
    }, 
} 

Lassen Sie uns sagen, ich habe dies in meiner Datenbank:

<app-name>: { 
    "shop": { 
     "shop1": { 
     "menu": { 
      "some1": "thing1", 
      "some2": "thing2" 
     } 
     }, 
     "shop2": { 
     "menu": { 
      "some1": "thing1", 
      "some2": "thing2" 
     } 
     }, 
     "shop3": { 
     "menu": { 
      "some1": "thing1", 
      "some2": "thing2" 
     } 
     }, 
     "users": { 
     "K4of4ofp32kfoE": { 
     "shop": { 
      "shop1": true 
     } 
     }, 
     "fj3i53ogF34oGf329ieQ": { 
     "shop": { 
      "shop2": true 
     } 
     }, 

} 

Was soll ich in let shopRef in someIDforShop schreiben? Dadurch kann jeder Benutzer auf seinen "Shop" zugreifen. Ich habe versucht mit childByAutoID(), vorausgesetzt, es wird die Daten in Bezug auf den Benutzer abrufen, wie in den Regeln angegeben. Aber shopFetch() gibt nichts zurück, wenn ich frage print(snapshot)

Antwort

0

Ich fand einen Weg, um den Variablennamen jedes Shops für jeden Benutzer zu erhalten.

import UIKit 
import Firebase 

let shopVar = "" 

override func viewDidLoad() { 
    super.viewDidLoad() 

    let userReference = DataService.instance.REF_USERS.child((user?.uid)!).child("shop") 
     userReference.observe(.value, with: { (snapshot) in  

     if let dict = snapshot.value as? [String:AnyObject] { 

       let shopName = dict["name"] as! String 
       print(shopName) 

       self.shopVar = shopName 

      } 

     }, withCancel: nil) 
} 

Regeln ändern

"users": { 
     "K4of4ofp32kfoE": { 
     "shop": { 
      "name": "coolShop" 
     } 
     }, 
     "fj3i53ogF34oGf329ieQ": { 
     "shop": { 
      "name": "fancyShop" 
     } 
     }, 
} 

Dann ersetze ich shopVar ->someIDforShop in shopFetch()

Jetzt kann jeder Benutzer seinen/ihre eigenen persönlichen 'Shop' Artikel erhält.

Verwandte Themen