2015-06-05 61 views
0

首先,我已經研究過這個,並且引用了前一個問題。我已經完成了這個問題所陳述的內容,但沒有任何積極的結果。帶用戶角色的FireBase安全規則

Firebase: set security rules depending on user roles

我使用:

Angular JS 
Firebase 
AngularFire -- Integrate Firebase with AngularJS 
E-mail and Password Firebase Authentication 

我在火力地堡爲我的用戶節點:

"users" : { 
    "simplelogin:49" : { 
    "email" : "[email protected]", 
    "full_name" : "First Last", 
    "roles" : { 
     "administrator" : true 
    } 
    }, 
    "simplelogin:64" : { 
    "email" : "[email protected]", 
    "full_name" : "first last", 
    "roles" : { 
     "administrator" : false 
    } 
    } 
} 

我試圖在添加一個條目我客戶表,同時登錄到simplelogin:49,正如你所看到的是一個廣告ministrator。

// Create the Client 
       var clientRef = firebaseUrl+'clients'; 

       var clientsListRef = new Firebase(clientRef); 
       clientsListRef.push({ 
        'uid': userData.uid, 
        'number': cl.number, 
        'company': cl.company, 
        'full_name': cl.full_name, 
        'email': cl.email, 
        'phones': { 
         'primary': cl.phones.primary, 
         'cell': cl.phones.cell, 
         'alte': cl.phones.alte 
        }, 
        'addresses': { 
         'billing': { 
          'line1': cl.addresses.billing.line1, 
          'line2': cl.addresses.billing.line2, 
          'city' : cl.addresses.billing.city, 
          'state': cl.addresses.billing.state, 
          'zip' : cl.addresses.billing.zip 
         }, 
         'shipping': { 
          'line1': cl.addresses.shipping.line1, 
          'line2': cl.addresses.shipping.line2, 
          'city' : cl.addresses.shipping.city, 
          'state': cl.addresses.shipping.state, 
          'zip' : cl.addresses.shipping.zip 
         } 
        } 

       }); 

我已經設置了火力地堡中的一些規則爲clients節點,並有如下幾點:

"clients": { 
     "$auth": { 
      ".write": "root.child('users').child('$auth.uid').child('roles').child('administrator').val() === true" 
     } 
     } 

我也試過這樣的規則:

"clients": { 
    ".write": "root.child('users').child('auth.uid').child('roles').child('administrator').val() === true" 
} 

所有我得到當我運行這個,並把它們放在一起是一個權限被拒絕的錯誤。如果我在Firebase模擬器中運行它,結果如下:

Attempt to write Success({"user":"Test"}) to /clients with auth=Success({"id":49,"provider":"password","uid":"simplelogin:49"}) 
/
/clients:.write: "root.child('users').child('auth.uid').child('roles').child('administrator').val() === true" 
    => false 

No .write rule allowed the operation. 
Write was denied. 

我只想知道我錯過了什麼。問題中的人說他/她在企業中取得了成功。

+1

不知道這是所有爲w rong,但至少'child('$ auth.uid')'應該是'child($ auth.uid)'(所以沒有引號)。 '$ auth'是一個變量,而''auth''只是一個字符串文字。 –

+0

您的數據樣本列出'用戶',但您的安全規則引用'客戶端'。不確定如果代碼不能準確地重現創建問題所需的條件,我們將會獲得多大的幫助。請參閱[創建mcve](http://stackoverflow.com/help/mcve) – Kato

+0

Frank Van Puffelen - 當我刪除引號時,Firebase將引發一個錯誤,指出不存在此類方法或屬性。該文件也稱它爲引號。 (https://www.firebase.com/docs/web/) – moevans

回答

0

首先,您應該使用爲每個用戶自動生成的Firebase身份驗證用戶標識。你將要看看如何訪問身份驗證的用戶ID的AngularFire文件,但通常它沿着線的東西:

firebase.auth().currentUser().uid 

然後,一旦你已經創建的用戶與ID爲的名稱字典像這樣:

"users" : { 
    "Rx6H4mjwwgVo6UKy2vSuOD5dTwk2" : { 
    "email" : "[email protected]", 
    "full_name" : "First Last", 
    "roles" : { 
     "administrator" : true 
    } 
    }, 
    "U1x3narB2AQQ0FvMxu7RVQAxb7A2" : { 
    "email" : "[email protected]", 
    "full_name" : "first last", 
    "roles" : { 
     "administrator" : false 
    } 
    } 
} 

可以使用在火力地堡數據庫安全規則auth.uid變量獲得他們的用戶ID:

"rules" : { 
    "clients": { 
    ".write": "root.child('users').child(auth.uid).child('roles').child('administrator').val() == true" 
    } 
}