2016-11-11 1 views
0

Это мой подход к тому, как разрешить конкретным пользователям доступ к их выделенному объекту «магазин».Firebase: доступ к различным разделам в зависимости от пользователя

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) 

    } 

Это мои правила безопасности

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" 
     } 
    }, 
} 

Скажем, у меня есть это в моей базе данных:

<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 
     } 
     }, 

} 

Что я должен написать в let shopRef в someIDforShop? Выполнение этого действия позволит каждому пользователю получить доступ к своему «магазину». Я пробовал с childByAutoID(), предполагая, что он будет извлекать данные относительно пользователя, как указано в правилах. Но shopFetch() ничего не возвращает, когда я прошу print(snapshot)

ответ

0

Я выяснил способ получить имя переменной каждого магазина для каждого пользователя.

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) 
} 

Правила изменить

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

Тогда я заменю shopVar ->someIDforShop в shopFetch()

Теперь каждый пользователь получает его/ее собственный личный 'магазин' пунктов.