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

时间:2017-01-03 23:36:12

标签: angularjs firebase firebase-authentication 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
        }]
    }
});

1 个答案:

答案 0 :(得分:1)

.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

中登录时处理该方案