如果用户未经过身份验证,则重定向到路由

w.b*_*ian 5 angularjs angular-routing

我正在尝试干净地实现一种方法,如果他们没有登录,将用户重定向到登录路由.我的解决方案是基于另一个SO答案,这里没有开箱即用.这是我的解决方案.

angular.module('myApp', ['ngResource', 'ngRoute'])
  .config(['$routeProvider', function ($routeProvider) {
    var requireAuthentication = function () {
        return {
            load: function ($q) {
                console.log('Can user access route?');
                if (g_isloggedIn === true) { // fire $routeChangeSuccess
                    var deferred = $q.defer();
                    deferred.resolve();
                    console.log('Yes they can!');
                    return deferred.promise;
                } else { // fire $routeChangeError
                    console.log('No they cant!');
                    return $q.reject("'/login'");
                }
            }
        };
    };

    $routeProvider
        .when('/some_page_that_requires_authentication', {
            templateUrl: '/views/secret.html',
            controller: 'secretCtrl',
            resolve: requireAuthentication()
        })
        .when('/anybody_can_see_me', {
            templateUrl: '/views/public.html',
            controller: 'publicCtrl',
        });
}]);
Run Code Online (Sandbox Code Playgroud)

我的问题是,我在哪里可以听取$routeChangeError事件,以便我可以重定向路线?我尝试在指令中执行它,但永远不会触发事件.我无法将其放入控制器,因为如果承诺被拒绝,它将无法加载.有什么想法吗?

Jen*_*ens 0

您可能会在此问题中找到一些帮助:AngularJS: Understanding $rootScope.$on('$routeChangeSuccess

一般来说,我觉得使用“resolve”来确保身份验证有点奇怪,但没有更好的方法,我建议添加一些服务等。这不是重点。

最后,其他路由解决方案(例如https://github.com/dotJEM/angular-routing)可以为您提供更好的控制程度。