如何将angularfire登录对象移动到服务文件中



我希望能够在我的网站上全局使用登录的对象。我想知道,如何将对象移动到服务并利用它来检查loggedin。这是我的登录控制器:

.controller('LoginCtrl', function ($scope, $location, userAuth) {
     $scope.login = function() {
      $scope.authData = null;
      $scope.error = null;
      userAuth.$signInWithEmailAndPassword($scope.loginemail, $scope.loginpassword)
      .then(function(authData) {
        $scope.authData = authData;
        console.log(authData);
      }).catch(function(error) {
        $scope.error = error.message;
      });
    };

我的服务是:

.service('userAuth', ["$firebaseAuth", function($firebaseAuth) {
    return $firebaseAuth();
  }

我能够成功登录,但我希望能够在全球范围内使用登录凭据。通过这样做,我还应该如何防止某些路由,除非用户经过身份验证。

如果路由仅适用于loggedin用户,请将他们重定向到loggepin页面。如果他们已经登录并试图访问注册页面,请将他们注销。如果他们登录并试图访问登录页面,请将他们重定向到配置文件页面。

我建议将用户数据存储在服务本身中,而不是将其返回给调用者。例如:

.service('userAuth', ["$firebaseAuth", function($firebaseAuth) {
    var userData;
    this.login = function(loginEmail, loginPassword){
       return $firebaseAuth
       .$signInWithEmailAndPassword(loginEmail, loginPassword)
       .then(function(authData) {
           userData = authData;
       });
    }
    this.getUserData = function(){
       return userData;
    }
  }

并将其用于控制器:

.controller('LoginCtrl', function ($scope, $location, userAuth) {
     $scope.login = function() {
      $scope.authData = null;
      $scope.error = null;
      userAuth.login($scope.loginemail, $scope.loginpassword)
      .then(function() {
        $scope.authData = userAuth.getUserData();
        console.log($scope.authData);
      }).catch(function(error) {
        $scope.error = error.message;
      });
    };

使用这种方法,您可以获得几个好处:

  1. 封装登录逻辑。通过这种方式,您可以轻松更改登录服务,而不会中断应用程序的任何其他部分。

  2. 通过注入auth服务并调用getUserData函数,您可以访问应用程序任何部分的用户数据。

为了防止用户访问特定路线,您可以使用$routeChangeStart事件捕获路线更改以停止导航,然后根据业务逻辑重定向到其他路线。

相关内容

  • 没有找到相关文章

最新更新