locationChangeStart并阻止路由更改

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

标签: angularjs authentication url-redirection angularjs-routing angularjs-authentication

我正在尝试创建基本验证,无论用户是否可以访问某些路由。 我在这方面取得了进展,但有一点是我无法弄清楚的。

我正在使用$ locationChangeStart来监控路线变化。场景是: 1.如果用户已登录,则允许他访问除auth路由(登录,注册)之外的所有路由。我正在通过从我的AuthFactory调用方法isAuthenticated()来检查这个 2.如果用户未登录,则只访问登录和注册路由。应该防止任何其他路由,并且在这种情况下应该将用户重定向到登录。

$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){
  if(AuthFactory.isAuthenticated()){
    if(AuthFactory.isAuthRoute(newUrl)){
      event.preventDefault();
      $location.path('/');
    }
  } else {
    if(!AuthFactory.isAuthRoute(newUrl)){
      event.preventDefault();
      $location.path('/login');
    }

  }
});

令我烦恼的是,那是带有preventDefault()的人。如果应用程序使用preventDefault(),location.path()之后的代码到达代码,则无法正常工作。

但是,如果我删除event.preventDefault(),则location.path()有效。问题是,如果非记录尝试访问某些非身份验证页面,我需要阻止这种情况。

基本上,我希望能够根据请求的路线进行预防或重定向。这样做的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

好的,你需要这样做:

var authPreventer = $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl){
    if(AuthFactory.isAuthenticated()){
        if(AuthFactory.isAuthRoute(newUrl)){
            event.preventDefault();
            authPreventer(); //Stop listening for location changes
            $location.path('/');
        }
    } 
    else {
        if(!AuthFactory.isAuthRoute(newUrl)){
            event.preventDefault();
            authPreventer(); //Stop listening for location changes
            $location.path('/login');
        }
    }
});

答案 1 :(得分:2)

您可以尝试在解析中使用auth以防止访问某些路线。 here是文档,它不是很清楚,但你可以找到很多例子。

答案 2 :(得分:0)

我最近遇到了同样的问题,我终于可以通过聆听$routeChangeStart而不是$locationChangeStart来解决问题(无需拨打$route.reload())。

这两个事件的文档有点模糊......我想在$ruteChangeStart之前调用$locationChangeStart事件(我将阅读源代码以完全理解这里发生的事情)。

答案 3 :(得分:-2)

好的,我设法使用$ routeChangeStart执行此操作。问题在于使用$ route.reload()。所以上面的代码应该看起来像这样:

$rootScope.$on('$routeChangeStart', function(event, next, current){
  if(AuthFactory.isAuthenticated()){
    if(AuthFactory.isAuthRoute(next.originalPath)){
      $route.reload();
      $location.path('/');
    }       
  } else {
    if(!AuthFactory.isAuthRoute(next.originalPath)){
      $route.reload();
      $location.path('/login');
    }
  }
});

我把它放在我的.run方法中,因此所有请求都在这里处理,我不需要考虑我(或其他人添加)的每个新路由。这就是为什么这对我来说看起来更干净 如果有人有不同的方法,请分享。

注意:以防万一,我也检查后端部分:)