如果用户使用 AngularFire 登录,我如何阻止访问 Angular 页面?

How can I prevent access to an Angular page if the user IS logged in with AngularFire?

我觉得这真的很容易,但我不确定为什么我无法弄清楚。

例如,如果我们想在用户未登录时限制对页面的访问,我们可以这样做:

// == LISTEN FOR ROUTE ERRORS
app.run(['$rootScope', '$location', function($rootScope, $location) {
    $rootScope.$on('$routeChangeError', function(event, next, previous, error) {
        if (error === 'AUTH_REQUIRED') {
            $location.path('/login');
        }
    });
}]);

// == RETURN AUTH SERVICE
app.factory('Authentication', ['$firebaseAuth', function($firebaseAuth) {
    return $firebaseAuth();
}]);

// == APP ROUTER
app.config(['$routeProvider', '$location', function($routeProvider, $location) {
    $routeProvider
        .when('/account', {
            controller: 'userController',
            templateUrl: 'views/account.html',
            resolve: {
                "currentAuth": ['Authentication', function(Authentication) {
                    return Authentication.$requireSignIn(); // if rejected throws $routeChangeError
                }]
            }
        })
}]);

现在,如果我想向 '/login' 路由添加解析,这样如果用户已登录,我可以强制他们进入帐户页面或成功页面怎么办?

.when('/login', {
    controller: 'userController',
    templateUrl: 'views/login.html',
    resolve: {
        "currentAuth": [function() {
            // reject if the user is already logged in
        }]
    }
});
.when('/login', {
    controller: 'userController',
    templateUrl: 'views/login.html',
    resolve: {
        "currentAuth": ['$q', function($q) {
            var p = $q.defer();
            if (Authentication.$getAuth()) {
                p.reject({code: someErrorCode, message: 'Already logged in'});
            } else {
                p.resolve();
            }
            return p.promise;
        }]
    }
});

您还应该在登录时处理该场景,在 $routeChangeError$stateChangeError