如何清除Angularfire会话授权($ onAuthStateChanged)

时间:2016-07-08 15:41:39

标签: angularjs firebase firebase-realtime-database angularfire firebase-authentication

目前我有一个授权系统,可以使用angularfire跟踪用户登录/注销状态。我正在查看的指南建议在每个控制器中使用$ onAuthStateChanged。

$rootScope.authObj.$onAuthStateChanged(function(firebaseUser) {
    if (firebaseUser) {
      console.log("Signed in as:", firebaseUser.uid);
      });
    } else {
      console.log("Signed out");
    }
  });

相反,我一直在使用$ rootScope.session变量来跟踪我当前登录的用户。这在大多数情况下都很有效,但我无法在其他控制器的开头访问此会话变量,因为该对象未在该点实例化。是否有一种干净的方法来访问控制器范围内的此会话变量,这样我就不必在每个函数中对数据库进行新的引用(因为这些函数在设置了会话变量后调用)

让事情变得更清楚。

ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings');
list = $firebaseArray(ref);

我的控制器顶部无效,因为$ rootScope.session.id尚未设置。

但是

$scope.addMeeting = function() {
    ref = firebase.database().ref("users/" + $rootScope.session.id + '/meetings');
    list = $firebaseArray(ref);
    list.$add({
        name: $scope.meetingname,
        date: firebase.database.ServerValue.TIMESTAMP
    });

};

在点击按钮时调用的函数是否有效,这将始终在页面已经加载之后,这意味着$ rootScope.session.id由该点设置。

-------------更新-----------------

我已经使用firebases建议的方法让它工作,但它看起来并不漂亮。它涉及将所有内容嵌套在firebase的Auth对象上的侦听器中,然后使用if语句确保用户对象不为null。

myApp.controller('MeetingsController', ['$scope', '$rootScope', '$firebaseAuth', '$firebaseArray', function($scope, $rootScope, $firebaseAuth, $firebaseArray){

  var authObj = $firebaseAuth();
  authObj.$onAuthStateChanged(function(firebaseUser) {

    if (firebaseUser) {
      var ref = firebase.database().ref("users/" + firebaseUser.uid + '/meetings');
      var meetings = $firebaseArray(ref);

      $scope.addMeeting = function() {
        meetings.$add({
            name: $scope.meetingname,
            date: firebase.database.ServerValue.TIMESTAMP
        });
      };

      $scope.deleteMeeting = function(key) {
        meetings.$remove(meetings.$getRecord(key)).then(function(ref) {
        })
        .catch(function(error){
          console.log(error);
        });
      };
    }
  }); //onAuthStateChange

}]); 

3 个答案:

答案 0 :(得分:2)

$rootScope对于此类存储来说是一个糟糕的选择,因为每次刷新页面时都会清理它。

你应该注意its constructor。它附带$localStorage$sessionStorage,请阅读以了解哪种内容更符合您的需求。

然后将ngStorage添加到您的模块并将$localStorage注入控制器。

$localstorage.sessionId = id;

这会将ID存储在您的浏览器中。

答案 1 :(得分:2)

angularfire将为您跟踪会话并维护当前用户信息。如果您在每个状态的解析中检查auth,您可以将经过身份验证的用户传递到每个控制器......由于底层的firebase SDK正在为您处理,因此无需本地存储。

提供有关您正在使用的指南的其他信息可能会有所帮助。

此处的文档https://github.com/firebase/angularfire/blob/master/docs/guide/user-auth.md#authenticating-with-routers已陈旧,但该模式仍可有效使用

答案 2 :(得分:0)

创建工厂以存储auth属性。这样的事情。

     app.factory('authService', function(){
      return{
        authenticated: false  
      }; 
     });

然后在控制器中检查它:

$scope.authenticated = authService.authenticated;

希望这能有所帮助

P.S控制器仅用于显示要查看的模型,任何功能都应在单独的指令或服务中移动。您的控制器将来需要清理。