2017-04-03 64 views
0

我剛剛從單一應用程序Polymer Web應用程序的json數據存儲更改爲了聚合力。我的網絡應用程序中的所有數據都是公開的,只有一個管理員應該更改數據,所以我只有一個頂級節點用於所有頁面數據。如何查看聚合火力中登錄的管理員?

對於登錄,我將firebase-auth元素與公共提供者一起使用,並設置了規則以賦予我的管理員寫入權限。

但現在我正在努力解決如何給登錄的管理員反饋以顯示他已登錄。爲此,我在我的數據庫中添加了第二個頂級節點('isAdmin'),它僅適用於一個登錄管理員,一個'Admin'鍵和一個布爾值'true'。我試圖綁定到與火力文檔,並在使用DOM,如果模板像這樣:

<firebase-auth 
     id="auth" 
     user="{{user}}" 
     provider="google" 
     app-name="myApp" 
     signed-in="{{signedIn}}"> 
    </firebase-auth>   
    <firebase-document 
     log 
     id="adminCheck" 
     app-name="myApp" 
     path="/isAdmin" 
     data="{{firebaseAdmin}}"> 
    </firebase-document> 

    <paper-button raised on-tap="login" hidden="[[user]]">Log in</paper-button>   
    <paper-button raised on-tap="logout" hidden="[[!user]]">Log out</paper-button> 

    <template is="dom-if" if="[[firebaseAdmin.Admin]]" restamp> 
     <span>Hello [[user.displayName]]!</span> 
    </template> 

然而,由於只有一個登錄的管理員可以讀取節點,管理員值實際上從未改變我的JavaScript,只有當我登錄後刷新瀏覽器。所以,如果我嘗試登錄,像這樣的狀態:

<script> 
    Polymer({ 
     is: 'my-login', 
     properties: { 
      user: { 
       type: Object 
      }, 
      firebaseAdmin: { 
       type: Object 
      }, 
     }, 
     _checkAdmin: function() { 
      var myVal = this.$.adminCheck.getStoredValue('/isAdmin'); 
      console.log('Value for admin stored in firebase-document element: ' + myVal.Admin); 
      console.log('Polymer property for admin: ' + this.firebaseAdmin.Admin); 

     }, 
     login: function() { 
      this.$.auth.signInWithPopup(); 
      this._checkAdmin(); 
     }, 
     logout: function() {    
      this.$.auth.signOut(); 
      this._checkAdmin(); 
     } 
    }); 
</script> 

我總是得到:即使登錄

Value for admin stored in firebase-document element: undefined Polymer property for admin: undefined

從我_checkAdmin機能恢復,只有當我刷新頁面。管理員登錄後,我會得到火力文檔日誌與在isAdmin節點存儲的對象:

Got stored value! Object {Admin: true} 

,現在我想用這個值被卡住,即使註銷。然後我_checkAdmin功能會隨時登錄這個:

Value for admin stored in firebase-document element: undefined 
Polymer property for admin: true 

然後我試圖各種事情沒有成功,但現在我想這是不檢查一個登錄管理的適當方法?我只是不認爲我應該直接在javascript中檢查uid。

高興,如果任何親會四周,想幫助我,亞歷克斯

感謝Michael Bleigh的幫助下,我終於得到了它的工作,像這樣:

<dom-module id="my-login"> 
<template> 
    <style> 
     span { 
      margin-left: 1rem; 
     } 
     paper-button { 
      background: -webkit-linear-gradient(#fff, #333 66%); 
      -webkit-background-clip: text; 
      background-clip: text; 
      -webkit-text-fill-color: transparent; 
     } 
    </style>   
    <firebase-auth 
     id="auth" 
     user="{{user}}" 
     provider="google" 
     app-name="myApp" 
     signed-in="{{signedIn}}"> 
    </firebase-auth>   
    <firebase-document 
     app-name="myApp" 
     path="/admins/[[user.uid]]" 
     data="{{isAdmin}}"> 
    </firebase-document> 

    <paper-button raised on-tap="login" hidden="[[user]]">Log in</paper-button>   
    <paper-button raised on-tap="logout" hidden="[[!user]]">Log out</paper-button>   
    <template is="dom-if" if="[[admin]]" restamp> 
     <span hidden="[[!user]]">Hello [[user.displayName]]!</span> 
    </template> 


</template> 
<script> 
    Polymer({ 
     is: 'my-login', 
     properties: { 
      user: { 
       type: Object 
      }, 
      isAdmin: { 
       type: Object 
      }, 
      admin: { 
       type: Boolean, 
       computed: '_checkAdmin(isAdmin)' 
      } 
     },    
     _checkAdmin: function(isAdmin) { 
      if (typeof isAdmin === 'boolean') { 
       console.log('Polymer property for admin is defined'); 
       return true; 
      } 
     }, 
     login: function() { 
      this.$.auth.signInWithPopup(); 

     }, 
     logout: function() {    
      this.$.auth.signOut(); 
     } 
    }); 
</script> 

回答

1

典型解決此問題的方法是將管理員作爲實時數據庫中的布爾圖寫入:

- admins 
    - {uid}: true 
    - {uid}: true 

然後,您可以設置安全規則,如:

{ 
    "admins": { 
    "$uid": { 
     ".read": "auth.uid === $uid" 
    } 
    } 
} 

這使得每個用戶閱讀自己admins節點,以檢查他們是否是管理員。現在,終於,你會綁定到該位置:

<firebase-auth user="{{user}}"></firebase-auth> 
<firebase-document path="/admins/[[user.uid]]" data="{{isAdmin}}"></firebase-document> 

在簽署時,data將成爲管理員null非管理員和true另外一個需要注意的是,你必須不依賴於UI單獨切換爲管理員控制。您應該編寫安全規則,以便只有admins節點中具有uid的用戶可以寫入數據庫的管理員保護區域。

+0

這個作品非常完美,非常感謝!我想我錯了,因爲我認爲我不需要動態的uid路徑,因爲我只有一個管理員。 – atomikolex