Вариант использования: я хочу перенаправить вошедших в систему пользователей в / dashboard и не вошедших в систему пользователей в /landing.
Первый дубль:
{
path: '**',
redirectTo: '/dashboard',
canActivate: [AuthGuard],
},
{
path: '**',
redirectTo: '/landing'
}
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) {}
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean|UrlTree> | Promise<boolean|UrlTree> | boolean | UrlTree {
return this.auth.isAuthenticated$
}
}
Все пользователи перенаправляются на страницу панели инструментов.
Вторая попытка:
{
path: '**',
redirectTo: '/home/loggedin',
canActivate: [AuthGuard],
data: { authGuard: { redirect: '/home/loggedout' } }
},
{
path: '**',
redirectTo: '/home/loggedin'
}
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(private auth: AuthService, private router: Router) {}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean|UrlTree> | Promise<boolean|UrlTree> | boolean | UrlTree {
return this.auth.isAuthenticated$.pipe(
map(loggedIn => {
console.log(`A=${loggedIn} ${JSON.stringify(next.data.authGuard.redirect)}`)
if (!loggedIn && next.data.authGuard.redirect) {
return this.router.parseUrl(next.data.authGuard.redirect);
} else {
return false;
}
})
);
}
}
Похоже, AuthGuard даже не вызывается. Возможно, если я использую компонент вместо перенаправления?
{
path: '**',
component: RedirectingComponent,
canActivate: [AuthGuard],
data: { authGuard: { redirect: '/home/loggedout' }, redirectComponent: { redirect: '/home/loggedin' } }
}
Теперь это, кажется, работает, но это также ужасный взлом.
Как можно заставить AuthGuards работать с перенаправлениями?