117

我有一个使用yeoman,grunt和bower创建的AngularJS应用程序。AngularJS-在每个路由和控制器中登录和验证

我有一个登录页面,有一个控制器检查身份验证。如果凭证正确,我将重新路由到主页。

app.js

'use strict'; 
//Define Routing for app 
angular.module('myApp', []).config(['$routeProvider', '$locationProvider', 
    function($routeProvider,$locationProvider) { 
    $routeProvider 
    .when('/login', { 
     templateUrl: 'login.html', 
     controller: 'LoginController' 
    }) 
    .when('/register', { 
     templateUrl: 'register.html', 
     controller: 'RegisterController' 
     }) 
    .when('/forgotPassword', { 
     templateUrl: 'forgotpassword.html', 
     controller: 'forgotController' 
     }) 
    .when('/home', { 
     templateUrl: 'views/home.html', 
     controller: 'homeController' 
    }) 
    .otherwise({ 
     redirectTo: '/login' 
    }); 
// $locationProvider.html5Mode(true); //Remove the '#' from URL. 
}]); 

angular.module('myApp').factory("page", function($rootScope){ 
    var page={}; 
    var user={}; 
    page.setPage=function(title,bodyClass){ 
     $rootScope.pageTitle = title; 
     $rootScope.bodylayout=bodyClass; 
    }; 
    page.setUser=function(user){ 
     $rootScope.user=user; 
    } 
    return page; 
}); 

LoginControler.js

'use strict'; 

angular.module('myApp').controller('LoginController', function($scope, $location, $window,page) { 
    page.setPage("Login","login-layout"); 
    $scope.user = {}; 
    $scope.loginUser=function() 
    { 
     var username=$scope.user.name; 
     var password=$scope.user.password; 
     if(username=="admin" && password=="admin123") 
     { 
      page.setUser($scope.user); 
      $location.path("/home"); 
     } 
     else 
     { 
      $scope.message="Error"; 
      $scope.messagecolor="alert alert-danger"; 
     } 
    } 
}); 

在主页上我有

<span class="user-info"> 
    <small>Welcome,</small> 
    {{user.name}} 
</span> 
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span> 

loginController,我检查登录信息一个d如果成功,我在服务工厂中设置用户对象。我不知道这是否正确。

我需要的是,当用户登录时,它在用户对象中设置一些值,以便所有其他页面都可以获得该值。

每当发生任何路由更改时,控制器应检查用户是否已登录。如果不是,它应该重新路由到登录页面。另外,如果用户已经登录并返回页面,则应该转到主页。控制器还应检查所有路线的凭证。

我听说过ng-cookies,但我不知道如何使用它们。

我看到的很多例子都不是很清楚,他们使用某种访问角色或者其他东西。我不想那样。我只想要一个登录过滤器。 有人可以给我一些想法吗?

回答

171

我的解决方案分为3个部分:用户的状态存储在服务中,在路径更改时您观察的运行方法中,并且检查用户是否被允许访问请求的页面如果用户的状态发生变化,您将观察控制器。

app.run(['$rootScope', '$location', 'Auth', function ($rootScope, $location, Auth) { 
    $rootScope.$on('$routeChangeStart', function (event) { 

     if (!Auth.isLoggedIn()) { 
      console.log('DENY'); 
      event.preventDefault(); 
      $location.path('/login'); 
     } 
     else { 
      console.log('ALLOW'); 
      $location.path('/home'); 
     } 
    }); 
}]); 

您应该创建一个服务(我将它命名为Auth),这将处理用户对象,要知道,如果用户登录或没有的方法。

服务

.factory('Auth', function(){ 
var user; 

return{ 
    setUser : function(aUser){ 
     user = aUser; 
    }, 
    isLoggedIn : function(){ 
     return(user)? user : false; 
    } 
    } 
}) 

从你app.run,你应该听的$routeChangeStart事件。当路线改变时,它将检查用户是否登录(isLoggedIn方法应该处理它)。如果用户没有登录,它将不会加载请求的路线,并且会将用户重定向到正确的页面(在您的案例登录中)。

loginController应该在登录页面中用于处理登录。它应该与Auth服务进行交互并将用户设置为已登录或未登录。

的LoginController

.controller('loginCtrl', [ '$scope', 'Auth', function ($scope, Auth) { 
    //submit 
    $scope.login = function() { 
    // Ask to the server, do your job and THEN set the user 

    Auth.setUser(user); //Update the state of the user in the app 
    }; 
}]) 

从你的主控制器,你可以在用户状态变化和重定向反应听。

.controller('mainCtrl', ['$scope', 'Auth', '$location', function ($scope, Auth, $location) { 

    $scope.$watch(Auth.isLoggedIn, function (value, oldValue) { 

    if(!value && oldValue) { 
     console.log("Disconnect"); 
     $location.path('/login'); 
    } 

    if(value) { 
     console.log("Connect"); 
     //Do something when the user is connected 
    } 

    }, true); 
+0

好的。什么应该在我的loginController?我的意思是我应该设置什么? – iCode

+1

loginController将允许用户从登录页面登录。它将处理登录表单。表单必须调用一个submit方法,它是loginController的一部分。此方法将更新(如果表单正确且用户必须登录)使用我描述的Auth服务的用户的状态。 – gab

+0

对不起,您可以展示如何编写该服务以及如何在LoginController中设置该服务? – iCode

-1

您应该检查两个主要站点中的用户身份验证。

  • 当用户改变状态,使用'$routeChangeStart'回调
  • 检查它当一个$ http请求被从发送角度,使用拦截器。
106

这是另一种可能的解决方案,使用$stateProvider$routeProviderresolve属性。例如用$stateProvider

.config(["$stateProvider", function ($stateProvider) { 

    $stateProvider 

    .state("forbidden", { 
    /* ... */ 
    }) 

    .state("signIn", { 
    /* ... */ 
    resolve: { 
     access: ["Access", function (Access) { return Access.isAnonymous(); }], 
    } 
    }) 

    .state("home", { 
    /* ... */ 
    resolve: { 
     access: ["Access", function (Access) { return Access.isAuthenticated(); }], 
    } 
    }) 

    .state("admin", { 
    /* ... */ 
    resolve: { 
     access: ["Access", function (Access) { return Access.hasRole("ROLE_ADMIN"); }], 
    } 
    }); 

}]) 

Access做出决议或拒绝根据当前用户权限的承诺:

.factory("Access", ["$q", "UserProfile", function ($q, UserProfile) { 

    var Access = { 

    OK: 200, 

    // "we don't know who you are, so we can't say if you're authorized to access 
    // this resource or not yet, please sign in first" 
    UNAUTHORIZED: 401, 

    // "we know who you are, and your profile does not allow you to access this resource" 
    FORBIDDEN: 403, 

    hasRole: function (role) { 
     return UserProfile.then(function (userProfile) { 
     if (userProfile.$hasRole(role)) { 
      return Access.OK; 
     } else if (userProfile.$isAnonymous()) { 
      return $q.reject(Access.UNAUTHORIZED); 
     } else { 
      return $q.reject(Access.FORBIDDEN); 
     } 
     }); 
    }, 

    hasAnyRole: function (roles) { 
     return UserProfile.then(function (userProfile) { 
     if (userProfile.$hasAnyRole(roles)) { 
      return Access.OK; 
     } else if (userProfile.$isAnonymous()) { 
      return $q.reject(Access.UNAUTHORIZED); 
     } else { 
      return $q.reject(Access.FORBIDDEN); 
     } 
     }); 
    }, 

    isAnonymous: function() { 
     return UserProfile.then(function (userProfile) { 
     if (userProfile.$isAnonymous()) { 
      return Access.OK; 
     } else { 
      return $q.reject(Access.FORBIDDEN); 
     } 
     }); 
    }, 

    isAuthenticated: function() { 
     return UserProfile.then(function (userProfile) { 
     if (userProfile.$isAuthenticated()) { 
      return Access.OK; 
     } else { 
      return $q.reject(Access.UNAUTHORIZED); 
     } 
     }); 
    } 

    }; 

    return Access; 

}]) 

UserProfile复制当前用户的属性,并执行$hasRole$hasAnyRole$isAnonymous$isAuthenticated方法逻辑(加上$refresh方法,稍后解释):

.factory("UserProfile", ["Auth", function (Auth) { 

    var userProfile = {}; 

    var clearUserProfile = function() { 
    for (var prop in userProfile) { 
     if (userProfile.hasOwnProperty(prop)) { 
     delete userProfile[prop]; 
     } 
    } 
    }; 

    var fetchUserProfile = function() { 
    return Auth.getProfile().then(function (response) { 
     clearUserProfile(); 
     return angular.extend(userProfile, response.data, { 

     $refresh: fetchUserProfile, 

     $hasRole: function (role) { 
      return userProfile.roles.indexOf(role) >= 0; 
     }, 

     $hasAnyRole: function (roles) { 
      return !!userProfile.roles.filter(function (role) { 
      return roles.indexOf(role) >= 0; 
      }).length; 
     }, 

     $isAnonymous: function() { 
      return userProfile.anonymous; 
     }, 

     $isAuthenticated: function() { 
      return !userProfile.anonymous; 
     } 

     }); 
    }); 
    }; 

    return fetchUserProfile(); 

}]) 

Auth负责请求服务器,知道用户简档(与连接到例如该请求接入令牌)的:

.service("Auth", ["$http", function ($http) { 

    this.getProfile = function() { 
    return $http.get("api/auth"); 
    }; 

}]) 

服务器预期返回这样一个JSON对象请求时GET api/auth

{ 
    "name": "John Doe", // plus any other user information 
    "roles": ["ROLE_ADMIN", "ROLE_USER"], // or any other role (or no role at all, i.e. an empty array) 
    "anonymous": false // or true 
} 

最后,当Access拒绝一个承诺,如果使用ui.router,该$stateChangeError事件将被解雇:

.run(["$rootScope", "Access", "$state", "$log", function ($rootScope, Access, $state, $log) { 

    $rootScope.$on("$stateChangeError", function (event, toState, toParams, fromState, fromParams, error) { 
    switch (error) { 

    case Access.UNAUTHORIZED: 
     $state.go("signIn"); 
     break; 

    case Access.FORBIDDEN: 
     $state.go("forbidden"); 
     break; 

    default: 
     $log.warn("$stateChangeError event catched"); 
     break; 

    } 
    }); 

}]) 

如果使用ngRoute,所述$routeChangeError事件将被触发:

.run(["$rootScope", "Access", "$location", "$log", function ($rootScope, Access, $location, $log) { 

    $rootScope.$on("$routeChangeError", function (event, current, previous, rejection) { 
    switch (rejection) { 

    case Access.UNAUTHORIZED: 
     $location.path("/signin"); 
     break; 

    case Access.FORBIDDEN: 
     $location.path("/forbidden"); 
     break; 

    default: 
     $log.warn("$stateChangeError event catched"); 
     break; 

    } 
    }); 

}]) 

用户简档还可以在控制器访问:

.state("home", { 
    /* ... */ 
    controller: "HomeController", 
    resolve: { 
    userProfile: "UserProfile" 
    } 
}) 

UserProfile于是包含返回的属性由服务器在请求时提供GET api/auth

要刷新种
.controller("HomeController", ["$scope", "userProfile", function ($scope, userProfile) { 

    $scope.title = "Hello " + userProfile.name; // "Hello John Doe" in the example 

}]) 

UserProfile需求,当用户迹象或缩小,从而使Access可以处理与新的用户配置文件的路径。您可以重新加载整个页面,或致电UserProfile.$refresh()

.service("Auth", ["$http", function ($http) { 

    /* ... */ 

    this.signIn = function (credentials) { 
    return $http.post("api/auth", credentials).then(function (response) { 
     // authentication succeeded, store the response access token somewhere (if any) 
    }); 
    }; 

}]) 
.state("signIn", { 
    /* ... */ 
    controller: "SignInController", 
    resolve: { 
    /* ... */ 
    userProfile: "UserProfile" 
    } 
}) 
.controller("SignInController", ["$scope", "$state", "Auth", "userProfile", function ($scope, $state, Auth, userProfile) { 

    $scope.signIn = function() { 
    Auth.signIn($scope.credentials).then(function() { 
     // user successfully authenticated, refresh UserProfile 
     return userProfile.$refresh(); 
    }).then(function() { 
     // UserProfile is refreshed, redirect user somewhere 
     $state.go("home"); 
    }); 
    }; 

}]) 
+3

我认为这是最简单也是最具扩展性的答案 – Jotham

+0

我喜欢这个答案而不是deferred.reject(Access.FORBIDDEN);我会保留这个API调用(超出限制)。从访问页面的用户角度来看,他们可以是OK或UNAUTHORIZED。 –

+2

@LeblancMeneses谢谢:)只是为了让它更清晰:UNAUTHORIZED意味着*“我们不知道你是谁,所以我们不能说如果你有权访问这个资源或不是,请先登录”* ,而FORBIDDEN的意思是*“我们知道你是谁,而你的个人资料不允许你访问这个资源”*。 – sp00m

6

我写了一篇几个月就如何建立用户注册和登录功能与角回,你可以在http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and-Login-Example.aspx

检查出来:在登录时例我检查,如果用户在$locationChangeStart事件记录下来,这是我的主要app.js显示此:

(function() { 
    'use strict'; 
  
    angular 
        .module('app', ['ngRoute', 'ngCookies']) 
        .config(config) 
        .run(run); 
  
    config.$inject = ['$routeProvider', '$locationProvider']; 
    function config($routeProvider, $locationProvider) { 
        $routeProvider 
            .when('/', { 
                controller: 'HomeController', 
                templateUrl: 'home/home.view.html', 
                controllerAs: 'vm' 
            }) 
  
            .when('/login', { 
                controller: 'LoginController', 
                templateUrl: 'login/login.view.html', 
                controllerAs: 'vm' 
            }) 
  
            .when('/register', { 
                controller: 'RegisterController', 
                templateUrl: 'register/register.view.html', 
                controllerAs: 'vm' 
            }) 
  
            .otherwise({ redirectTo: '/login' }); 
    } 
  
    run.$inject = ['$rootScope', '$location', '$cookieStore', '$http']; 
    function run($rootScope, $location, $cookieStore, $http) { 
        // keep user logged in after page refresh 
        $rootScope.globals = $cookieStore.get('globals') || {}; 
        if ($rootScope.globals.currentUser) { 
            $http.defaults.headers.common['Authorization'] = 'Basic ' + $rootScope.globals.currentUser.authdata; // jshint ignore:line 
        } 
  
        $rootScope.$on('$locationChangeStart', function (event, next, current) { 
            // redirect to login page if not logged in and trying to access a restricted page 
            var restrictedPage = $.inArray($location.path(), ['/login', '/register']) === -1; 
            var loggedIn = $rootScope.globals.currentUser; 
            if (restrictedPage && !loggedIn) { 
                $location.path('/login'); 
            } 
        }); 
    } 
  
})(); 
+0

写得很好,我用它作为参考。谢谢@Jason。 –

+0

它没有帮助,很不清楚 – ritesh

0

例如,一个应用程序有两个用户叫ap和auc。我将一个额外的属性传递给每个路由并根据我在$ routeChangeStart中获得的数据处理路由。

试试这个:

angular.module("app").config(['$routeProvider', 
function ($routeProvider) { 

    $routeProvider. 
      when('/ap', { 
       templateUrl: 'template1.html', 
       controller: 'template1', 
       isAp: 'ap', 
      }). 
      when('/auc', { 
       templateUrl: 'template2.html', 
       controller: 'template2', 
       isAp: 'common', 
      }). 
      when('/ic', { 
       templateUrl: 'template3.html', 
       controller: 'template3', 
       isAp: 'auc', 
      }). 
      when('/mup', { 
       templateUrl: 'template4.html', 
       controller: 'template4', 
       isAp: 'ap', 
      }). 

      when('/mnu', { 
       templateUrl: 'template5.html', 
       controller: 'template5', 
       isAp: 'common', 
      }).        
      otherwise({ 
       redirectTo: '/ap', 
      }); 
    }]); 

app.js:

.run(['$rootScope', '$location', function ($rootScope, $location) {     
    $rootScope.$on("$routeChangeStart", function (event, next, current) { 
     if (next.$$route.isAp != 'common') { 
      if ($rootScope.userTypeGlobal == 1) { 
       if (next.$$route.isAp != 'ap') { 
        $location.path("/ap"); 
       } 
      } 
      else { 
       if (next.$$route.isAp != 'auc') { 
        $location.path("/auc"); 
       }       
      } 
     } 

    }); 
}]); 
0

所有建议大的解决方案,为什么您在客户端会话令人担忧的。 我的意思是当状态/网址更改时,我想你正在做一个Ajax调用来加载温度数据。

Note :- To Save user's data you may use `resolve` feature of `ui-router`. 
Check cookie if it exist load template , if even cookies doesn't exist than 
there is no chance of logged in , simply redirect to login template/page. 

现在ajax数据由服务器使用任何api返回。现在这一点开始起作用,根据用户的登录状态返回使用服务器的标准返回类型。检查这些返回代码并在控制器中处理您的请求。 注: - 对于控制器不需要一个Ajax调用本身,你可以这样调用server.location/api/checkSession.php空白请求服务器,这是checkSession.php

<?php/ANY_LANGUAGE 
session_start();//You may use your language specific function if required 
if(isset($_SESSION["logged_in"])){ 
set_header("200 OK");//this is not right syntax , it is just to hint 
} 
else{ 
set_header("-1 NOT LOGGED_IN");//you may set any code but compare that same  
//code on client side to check if user is logged in or not. 
} 
//thanks..... 

在客户端内的控制器或通过任何在其他的答案显示

$http.get(dataUrl) 
    .success(function (data){ 
     $scope.templateData = data; 
    }) 
    .error(function (error, status){ 
     $scope.data.error = { message: error, status: status}; 
     console.log($scope.data.error.status); 
if(status == CODE_CONFIGURED_ON_SERVER_SIDE_FOR_NON_LOGGED_IN){ 
//redirect to login 
    }); 

注服务: - 我会更新更多的明天或未来

0

app.js

'use strict'; 
// Declare app level module which depends on filters, and services 
var app= angular.module('myApp', ['ngRoute','angularUtils.directives.dirPagination','ngLoadingSpinner']); 
app.config(['$routeProvider', function($routeProvider) { 
    $routeProvider.when('/login', {templateUrl: 'partials/login.html', controller: 'loginCtrl'}); 
    $routeProvider.when('/home', {templateUrl: 'partials/home.html', controller: 'homeCtrl'}); 
    $routeProvider.when('/salesnew', {templateUrl: 'partials/salesnew.html', controller: 'salesnewCtrl'}); 
    $routeProvider.when('/salesview', {templateUrl: 'partials/salesview.html', controller: 'salesviewCtrl'}); 
    $routeProvider.when('/users', {templateUrl: 'partials/users.html', controller: 'usersCtrl'}); 
    $routeProvider.when('/forgot', {templateUrl: 'partials/forgot.html', controller: 'forgotCtrl'}); 


    $routeProvider.otherwise({redirectTo: '/login'}); 


}]); 


app.run(function($rootScope, $location, loginService){ 
    var routespermission=['/home']; //route that require login 
    var salesnew=['/salesnew']; 
    var salesview=['/salesview']; 
    var users=['/users']; 
    $rootScope.$on('$routeChangeStart', function(){ 
     if(routespermission.indexOf($location.path()) !=-1 
     || salesview.indexOf($location.path()) !=-1 
     || salesnew.indexOf($location.path()) !=-1 
     || users.indexOf($location.path()) !=-1) 
     { 
      var connected=loginService.islogged(); 
      connected.then(function(msg){ 
       if(!msg.data) 
       { 
        $location.path('/login'); 
       } 

      }); 
     } 
    }); 
}); 

loginServices.js

'use strict'; 
app.factory('loginService',function($http, $location, sessionService){ 
    return{ 
     login:function(data,scope){ 
      var $promise=$http.post('data/user.php',data); //send data to user.php 
      $promise.then(function(msg){ 
       var uid=msg.data; 
       if(uid){ 
        scope.msgtxt='Correct information'; 
        sessionService.set('uid',uid); 
        $location.path('/home'); 
       }   
       else { 
        scope.msgtxt='incorrect information'; 
        $location.path('/login'); 
       }     
      }); 
     }, 
     logout:function(){ 
      sessionService.destroy('uid'); 
      $location.path('/login'); 
     }, 
     islogged:function(){ 
      var $checkSessionServer=$http.post('data/check_session.php'); 
      return $checkSessionServer; 
      /* 
      if(sessionService.get('user')) return true; 
      else return false; 
      */ 
     } 
    } 

}); 

sessionServices.js

'use strict'; 

app.factory('sessionService', ['$http', function($http){ 
    return{ 
     set:function(key,value){ 
      return sessionStorage.setItem(key,value); 
     }, 
     get:function(key){ 
      return sessionStorage.getItem(key); 
     }, 
     destroy:function(key){ 
      $http.post('data/destroy_session.php'); 
      return sessionStorage.removeItem(key); 
     } 
    }; 
}]) 

loginCtrl。JS

'use strict'; 

app.controller('loginCtrl', ['$scope','loginService', function ($scope,loginService) { 
    $scope.msgtxt=''; 
    $scope.login=function(data){ 
     loginService.login(data,$scope); //call login service 
    }; 

}]); 
18

限定用于各个路由自定义行为的最简单的方式将是相当简单:

1)routes.js:创建一个新的属性(如requireAuth),用于任何所希望的路线

angular.module('yourApp').config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
     .when('/home', { 
      templateUrl: 'templates/home.html', 
      requireAuth: true 
     }) 
     .when('/login', { 
      templateUrl: 'templates/login.html', 
     }) 
     .otherwise({ 
      redirectTo: '/home' 
     }); 
}]) 

2)在未绑定到ng-view内的元素的顶级控制器中(为了避免与角相冲突),检查newUrlrequireAuth财产和采取相应的行动

angular.module('YourApp').controller('YourController', ['$scope', 'session', '$location', 
    function($scope, session, $location) { 

     $scope.$on('$routeChangeStart', function(angularEvent, newUrl) { 

      if (newUrl.requireAuth && !session.user) { 
       // User isn’t authenticated 
       $location.path("/login"); 
      } 

     }); 
    } 
]); 
+1

我们可以指定'requireAuth :真''属性到所有的路线在一个地方?因为在我的情况下,他们不是一个登录页面,但它从第三方休息电话获得认证所以我想指定在一个地方,它应该适用于未来添加 – Raghuveer

+1

不是我所知道的,也许你可以检查**每条**路线,没有'routes.js'中定义的特殊属性。 – DotBot

+1

伟大而简单的例子。它对我的需求非常有帮助。 – error505

2

我觉得这种方式是最容易的,但也许这只是个人喜好。

当你登录指定路线(以及任何其他匿名航线;例如:/寄存器/注销,/ refreshToken等),添加:

allowAnonymous: true 

所以,这样的事情:

$stateProvider.state('login', { 
    url: '/login', 
    allowAnonymous: true, //if you move this, don't forget to update 
          //variable path in the force-page check. 
    views: { 
     root: { 
      templateUrl: "app/auth/login/login.html", 
      controller: 'LoginCtrl' 
     } 
    } 
    //Any other config 
} 

您不需要指定“allowAnonymous:false”,如果不存在,则在检查中假定为false。在大多数网址被强制认证的应用程序中,这是不太方便的。更安全;如果您忘记将其添加到新网址,则可能发生的最糟糕情况是匿名网址受到保护。如果以另一种方式进行,指定“requireAuthentication:true”,并且忘记将其添加到URL中,则会向公众泄露一个敏感页面。

然后在您认为最适合您的代码设计的任何地方运行此操作。

//I put it right after the main app module config. I.e. This thing: 
angular.module('app', [ /* your dependencies*/ ]) 
     .config(function (/* you injections */) { /* your config */ }) 

//Make sure there's no ';' ending the previous line. We're chaining. (or just use a variable) 
// 
//Then force the logon page 
.run(function ($rootScope, $state, $location, User /* My custom session obj */) { 
    $rootScope.$on('$stateChangeStart', function(event, newState) { 
     if (!User.authenticated && newState.allowAnonymous != true) { 
      //Don't use: $state.go('login'); 
      //Apparently you can't set the $state while in a $state event. 
      //It doesn't work properly. So we use the other way. 
      $location.path("/login"); 
     } 
    }); 
}); 
0

您可以使用resolve

angular.module('app',[]) 
.config(function($routeProvider) 
{ 
    $routeProvider 
    .when('/', { 
     templateUrl : 'app/views/login.html', 
     controller : 'YourController', 
     controllerAs : 'Your', 
     resolve: { 
      factory : checkLoginRedirect 
     } 
    }) 
} 

而且,决心的功能:

function checkLoginRedirect($location){ 

    var user = firebase.auth().currentUser; 

    if (user) { 
     // User is signed in. 
     if ($location.path() == "/"){ 
      $location.path('dash'); 
     } 

     return true; 
    }else{ 
     // No user is signed in. 
     $location.path('/'); 
     return false; 
    } 
} 

火力地堡也有帮助您安装一个观察者的方法,我建议安装它里面有一个.run

.run(function(){ 

    firebase.auth().onAuthStateChanged(function(user) { 
     if (user) { 
      console.log('User is signed in.'); 
     } else { 
      console.log('No user is signed in.'); 
     } 
    }); 
    }