我正在尝试创建用户是否可以访问某些路由的基本验证。我在这方面取得了进展,但有一件事我无法理解。
我正在使用$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()
有效。这样做的问题是,我需要防止未登录的用户试图访问某些非身份验证页面。
基本上,我希望能够阻止或重定向基于请求的路由。正确的方法是什么?
好的,你需要这样做:
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');
}
}
});
您可以尝试在解析中使用auth,以防止访问某些路由。这是博士,不是很清楚,但你可以在那里找到很多例子。
我最近遇到了同样的问题,我终于能够通过听$routeChangeStart
而不是$locationChangeStart
来解决它(无需调用$route.reload()
)。
这两个事件的文件都有点模糊。。。我假设$ruteChangeStart
事件是在$locationChangeStart
之前调用的(我将阅读源代码以完全理解这里发生的事情)。
好的,我使用$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方法中,所以所有的请求都在这里处理,我不需要考虑我(或其他人添加的)的每一个新路由。这就是为什么在我看来这更干净。
如果有人有不同的方法,请分享。
注意:以防万一,我也会检查后端部分:)