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.'); 
     } 
    }); 
    }