2015-06-10 31 views
9

所以每當我從火力地堡註銷,我被加上Firebase註銷顯示權限被拒絕錯誤。

Error: permission_denied: Client doesn't have permission to access the desired data. 

我的理解是,因爲登錄會話終止時,我的一些對象不能再訪問火力點的數據。但是如何在註銷之前斷開這些對象呢?

對於我離子查看一個註銷按鈕,它只是調用一個火力點服務:

function logout() { 
     auth.$unauth(); 
     getCurrentUser(); 
}; 
function getCurrentUser() { 
     var authData = auth.$getAuth(); 
     if (authData) { 
      $rootScope.userId = authData.uid; 
      $rootScope.currentUser = $firebaseObject(authRef.child("users").child(authData.uid)); 
      return $rootScope.currentUser; 
     } else { 
      console.log("User is not login!"); 
      $rootScope.userId = null; 
      $location.path("/auth/signin"); 
      if ($rootScope.currentUser) { 
      $rootScope.currentUser.$destroy(); 
      } 
     } 
    }; 

所以我摧毀$ rootScope.currentUser那裏。我使用相同的getCurrentUser配置文件頁面。所以錯誤沒有以這種方式顯示。但是在其他視圖中,我有另一個$ firebaseArray,還有另一個Ref.on(「child_added」,函數(snap)與同一個$ firebaseObject。當我查看配置文件頁面時,此頁面至少有3個firebase連接,我得到了3個permission_denied我註銷時出現錯誤(註銷按鈕在用戶配置文件頁面上)

我的問題是,如何在註銷之前斷開此Firebase連接?是否有方法斷開所有Firebase連接 - 無論AngularFire或常規的Firebase?所以我可以註銷而不用擔心哪些Firebase連接沒有關閉?另外,由於註銷按鈕位於配置文件範圍內而其他連接位於不同範圍內,因此我不知道如何關閉連接甚至在配置文件範圍內都沒有...

+0

你在幹什麼用 「$ onAuth」 什麼?也許在你的驗證工廠? – jbdev

+0

是的,我願意。但使用onAuth在註銷時仍然不知道我應該關閉什麼。因爲我的例子無處不在。他們中的大多數在離開視圖時我無法關閉,因爲他們都需要聽取Firebase的更新。 –

回答

0

好吧,我想你有一個註銷按鈕。 所以在你的函數logout()中,你首先$銷燬數據對象,不知何故等待(這是我想弄清楚的最佳實踐),然後authref.unauth(); 我想說的是

+0

全部 - 我有同樣的問題,快速修復是更新規則{「.read」:true},僅用於讀取訪問,有點類似的文章,你可以想出一個簡單的方法來解決它http://堆棧溢出。com/questions/14296625/restrict-child-field-access-with-security-rules通過編寫裝飾器並銷燬所有使用$ firebaseArray和$ firebaseObject創建的firebase引用來解決此問題還有一些示例。 –

2

你需要銷燬所有登出時的firebase引用。 就是這樣。

在註銷功能。

function logout() { 
     auth.$unauth(); 
     $rootScope.$broadcast('logout'); 
}; 

在控制器

vm.profile = authService.profile(user.uid); // FirebaseObject Reference 
vm.parties = partyService.getPartiesByUser(user.uid); // FirebaseArray Reference 

$rootScope.$on('logout', function() { 
    vm.parties.$destroy(); 
    vm.profile.$destroy(); 
}); 
+0

這可以是一個解決方案。但是使用$ rootscope看起來有點冒險。 –

+0

使用$ rootScope,您可以在所有控制器中廣播註銷事件。 –

+0

如果你銷燬了你的firebase引用,你需要一些方法來重新初始化你的引用被定義的工廠/服務/控制器。如果您沒有登錄,並且重新登錄,則不會有任何數據。 –

-1

你需要摧毀您之前保存的數據對象的火力點REF。怎麼樣?

之前,我初始化我的var歌曲,如: this.songs = this.af.list('/ songs'); 。

當我signOut(),我應該銷燬我初始化,使得我執行變量的基準:

this.songs $ ref.off();

這條線,你的問題