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

时间:2013-12-11 23:16:05

标签: angularjs angular-routing

如果他们没有登录,我正在尝试干净地实现一种将用户重定向到登录路由的方法。我的解决方案是基于另一个SO解答here而无法解决的问题的盒子。这是我的解决方案。

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

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

3 个答案:

答案 0 :(得分:3)

您是否有理由不从功能内部重定向用户? 这对我来说很好,如果未解决承诺,它不会加载控制器/视图。

我修改了这个函数:

var requireAuthentication = function () {
    return {
        load: function ($q, $location) {
            console.log('Can user access route?');
            var deferred = $q.defer();
            deferred.resolve();
            if (g_isloggedIn === true) { // fire $routeChangeSuccess
                console.log('Yes they can!');
                return deferred.promise;
            } else { // fire $routeChangeError
                console.log('No they cant!');
                $location.path('/login');

                // I don't think this is still necessary:
                return $q.reject("'/login'");
            }
        }
    };
};

答案 1 :(得分:0)

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

一般来说,我觉得使用"解决"为了确保身份验证有点奇怪,但没有更好的方法,我建议添加一些服务等。除此之外。

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

答案 2 :(得分:0)

我确定你已经很好地解决了这个问题,但对于那些现在寻找答案的人来说,这是我的两分钱。

这里唯一缺少的是当承诺被拒绝时会发生什么。您希望通过HTTP拦截执行此操作。你把一个监听器放在routeChangeError上,并在那里重定向。 https://docs.angularjs.org/api/ng/service/$http(向下滚动到拦截器部分)