我正在尝试创建基本验证,无论用户是否可以访问某些路由。 我在这方面取得了进展,但有一点是我无法弄清楚的。
我正在使用$ 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()
有效。问题是,如果非记录尝试访问某些非身份验证页面,我需要阻止这种情况。
基本上,我希望能够根据请求的路线进行预防或重定向。这样做的正确方法是什么?
答案 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方法中,因此所有请求都在这里处理,我不需要考虑我(或其他人添加)的每个新路由。这就是为什么这对我来说看起来更干净 如果有人有不同的方法,请分享。
注意:以防万一,我也检查后端部分:)