如果 canLoad 或 canActivate 失败,如果没有在 AuthGuard 本身中进行路由,我如何路由登录?



所以,这就是我的AuthGuard的样子:

canLoad(route: Route) {
return this.store.select(fromRoot.getIsAuth).pipe(take(1));
}

我检查来自 app.component 的身份验证信息,并简单地返回一个可观察布尔值。

我不想订阅这个来重新路由,我不想在AuthGuard中使用router.naving,所以我想保持一个简单的Guard。

有没有办法在路由模块内重新路由,如果 AuthGuard 返回 false,它只是路由到备用路径?

据我所知,你必须在警卫中进行导航。无法将路由器配置为执行所需的操作。但您不需要订阅。您可以使用点击进行导航。

canLoad(route: Route) {
return this.store.select(fromRoot.getIsAuth)
.pipe(
take(1),
tap(loggedIn => {
if (!loggedIn) {
this.router.navigate(['/login']);
}
})
);
}

TLDR;如果您直接在OnLoad内导航,您将收到一个 NavigationCancel 事件,其中包含有关不匹配 ID 的消息(我讨厌这个错误!你可以这样避免它:

this.routerEvents.navigationCancel$.pipe(take(1)).subscribe(() =>
{           
this.router.navigateByUrl(result); 
});
return false;

我不确定大多数人何时使用canLoadcanActivate但我的具体情况(和解决方案(如下:

  • 我有一个从我的AuthGuard服务内部显示的登录对话框。AuthGuard显示对话框,但在用户尝试登录之前不会返回 true/false。
  • 如果登录失败并且需要将用户重定向到特定页面(例如支持页面(,则AuthGuard服务将返回UrlTree
  • 我的"/account"路由加载延迟,可能需要几秒钟才能加载
  • 我希望当用户单击"帐户"时立即出现登录对话框,从而添加CanLoad
  • 因此,我所做的是将相同的逻辑放入我的canLoad处理程序中。这意味着如果canLoad首先被点击,它还会显示一个对话框。
  • 我让我的canActivate守卫运行完全相同的逻辑(别担心 - 你永远不会看到两个对话框(

对于这种情况,我发现在canLoad中执行以下操作最容易:

canLoad(route: Route, segments: UrlSegment[])
{
const currentNavigation = this.router.getCurrentNavigation();
const isInitialNavigation = !currentNavigation.previousNavigation;
if (isInitialNavigation)
{
return true;   // always allow load for first navigation (avoids other complications)
}
else {
// returns Observable<boolean | UrlTree> 
return showLoginDialog().pipe(map(result => {
if (typeof result === 'boolean') {
return result;
}
else {
// we have a URL tree
// wait for the expected NavigationCancel event and then navigate
this.routerEvents.navigationCancel$.pipe(take(1)).subscribe(() =>
{           
this.router.navigateByUrl(result); 
});
return false;
}
});;    
}
}

我还有一个根RouterEvents服务提供,我在其中定义

navigationCancel$ = this.router.events.pipe(filter((e): e is NavigationCancel => e instanceof NavigationCancel));

注意:如果您选择不包括isInitialNavigation检查,请注意。如果您的重定向试图重定向到主页,那么它将不起作用,因为路由器认为您已经在那里。您可以使用仅重定向到主页的/redirect_home路由来解决此问题 - 或更改onSameURLNavigation设置。

相关内容

  • 没有找到相关文章

最新更新