angular - Auth Guard 在无效 url 的情况下导航到基本 url
问题描述
如果 url 无效,我正在尝试使用authguard
并希望导航到/notfound
url。这是我的authguard
:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
const self = this;
const userId= route.params.id;
if(!userId){
return false;
}
else{
return from(this.authservice.httpUnauthorizedGet("/api/Users/isUserValid/" + userId)).pipe(
map((data) => {
const dataUpdated: any = data;
if (dataUpdated.allowed === false) {
self.router.navigate(['/notfound']);
return false;
}
return dataUpdated.allowed;
}),
catchError(() => {
self.router.navigate(['/notfound']);
return of(false);
}),
);
}
}
这是有效的,但如果 url 无效(例如:)/users/1234
,它首先导航到基本 url( http://localhost:4200
),然后导航到http://localhost:4200/notfound
. 当我打开/notfound
并单击返回时,而不是被导航到 时/users/1234
,我被导航到 baseurl。
我认为这是因为return false
. 这导致导航到基本 url,然后router.navigate
导航到/notfound
.
有什么办法,我可以简单地导航到/notfound
而不是去基本网址?
解决方案
我没有将 404 导航逻辑放入AuthenticationGuard.ts
,而是让其app.routing.ts
处理。您能否查看以下代码并在适合您的情况下相应地应用它。为了您的信息,我使用的 authService 是 ADAL,但这不应该是相关的。
身份验证.guard.ts
canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot): boolean {
if (this.authService.isLogged) {
return true;
} else {
this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
return false;
}
}
canActivateChild(childRoute: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
return this.canActivate(childRoute, state);
}
app.routing.ts
const routes: Route[] = [
{ path: 'login', component: LoginComponent },
{ path: 'logout', component: LogoutComponent },
{
path: '', component: MainComponent, canActivate: [ AuthenticationGuard ],
canActivateChild: [ AuthenticationGuard ], children: [
{ path: '', component: MyOwnComponent },
{ path: 'foo', component: FooComponent },
{ path: '**', component: NotFoundComponent }
]
}
]
export const AppRoutes: ModuleWithProviders = RouterModule.forRoot(routes)
下面一行是处理 404 的路由。
{ path: '**', component: NotFoundComponent }
推荐阅读
- azure-maps - Azure Maps - 如何在数据驱动样式表达式中使用 AND 逻辑
- python - 尽管已安装 Pyglet 模块但未找到
- javascript - 带有反应的 discord.js v12 验证系统
- powershell - PowerShell New-Item 将创建脚本所在的目录,而不是指定的路径
- c# - WPF - 尝试使用 INotifyPropertyChanged 从文本框更新中更新标签
- c# - 将 DataTable 保存到文件时,集合被修改异常
- python - Tf Lite 模型图像分类打印标签
- authentication - 安全 Vercel 无服务器功能
- reactjs - 与 wordpress gutenberg 中一样的 React 过滤器
- terraform - Terraform Datasource oci_core_volumes 模块返回函数的字符串