AngularJS:转发到登录页面进行身份验证,将路由保留为GET参数?

时间:2013-11-27 12:12:09

标签: javascript angularjs angular-routing

我是一个角色新手。我正在尝试编写一个Angular服务,在任何页面上,将检查用户是否已登录,如果没有,则将它们转发到登录页面,将其当前路径作为GET参数传递

我快到了,但不太合适。我遇到的问题如下:如果用户转到#/articles/my-articles/,他们会转发到#/login/?next=%2Farticles%2F:module%2F

换句话说,看起来Angular正在传递路由模式,而不是实际的URL。

这是我的身份验证码:

auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
    var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
    $rootScope.$on('$routeChangeStart', function (e, next, current) {
        if (next.$$route && !next.$$route.anonymous && !$user.authenticated) {
          var nextParam = next.$$route.originalPath;
          $location.url(MODULE_SETTINGS.LOGIN + '?next=' + nextParam);
        }
    });
}]);

我可以使用current.params.module以hacky方式获取原始路径 - 但这对我没有帮助,因为似乎routeChangeStart被多次触发而current对象是除了最后一次火灾之外的所有事情

这是我的路线档案:

articles.config(['$routeProvider', function ($routeProvider) {
  $routeProvider
    .when('/articles/:module/', {
        templateUrl: 'views/articles/article_list.html',
        controller: 'ArticlesListCtrl'
    })
    .when('/articles/:module/:id/', {
        templateUrl: 'views/articles/article_detail.html',
        controller: 'ArticlesDetailCtrl'
    });
}]);

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
    var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
    $rootScope.$on('$routeChangeStart', function (e, next, current) {
        if (!$user.authenticated) {
          $location.url(MODULE_SETTINGS.LOGIN + '?next=' + $location.path());
          $location.replace();
        }
    });
}]);

如果登录不是AngularJS视图,则可能需要提供otherwise路径:
(取决于你的$ locationProvider配置)

$routeProvider.otherwise({
    template: 'Redirecting…',
    controller : 'Redirect'
});

...

articles.controller('Redirect', ['$location', function($location) {
    if (someConditionThatChecksIfUrlIsPartOfApp) {
        location.href = $location.path();
        return;
    } else {
        // Show 404
    }
}]);

附注:您不应该阅读$$ - 前缀属性,它们是私有的AngularJS变量。
另请注意:请勿在您自己的代码中使用$前缀($user),这些是为AngularJS保留的公共属性。

答案 1 :(得分:0)

我的解决方案适用于Angular 1.2.13: preventDefault停止角度路由,$ window.location将我发送到登录页面。这是在一个ASP.NET MVC + Angular应用程序。

$rootScope.$on("$locationChangeStart", function (event, next, current) {
                    event.preventDefault();
                    $window.location = '/Login';
            }        
    });