6

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

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

$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

4 回答 4

4

好的,你需要这样做:

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');
        }
    }
});
于 2014-03-30T10:43:46.143 回答
2

您可以尝试在解析中使用 auth 以防止访问某些路由。 是文档,不是很清楚,但是您可以在那里找到很多示例。

于 2013-12-27T01:24:33.197 回答
0

我最近遇到了同样的问题,我终于能够通过听$routeChangeStart而不是$locationChangeStart(无需调用$route.reload())来解决它。

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

于 2014-06-23T14:58:24.257 回答
-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 方法中,所以所有的请求都在这里处理,我不需要考虑我(或其他人添加的)每条新路由。这就是为什么这对我来说看起来更干净。
如果有人有不同的方法,请分享。

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

于 2014-01-22T16:10:29.367 回答