В нашем приложении у нас есть функциональный модуль администратора, который мы пытаемся загружать лениво, убедившись, что пользователь аутентифицирован и имеет соответствующие роли.
Таким образом, если пользователь непосредственно набирает {root url} / admin , нам нужно сначала проверить, есть ли вошедший в систему пользователь, и если да, проверить, есть ли у пользователя правильные роли и только потом загрузить модуль. В случае неудачной первой проверки, когда пользователь еще не вошел в систему, пользователь должен быть направлен на страницу входа. При входе в систему снова выполняется такая же проверка ролей, и если она прошла, загрузите модуль или перенаправьте пользователя на страницу пользователя.
Что я пробовал до сих пор -
-
Создание защиты, которая реализует как canLoad, так и canActivate. Но перенаправление из canLoad не работает. Применяется охранник на маршруте {root url} / admin . Вот как canActivate и canLoad выглядит в охране
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree {
if (this.contextSvc.isAuthorized()) return this.contextSvc.isAuthorized()
else
return this.router.createUrlTree(["/login"], { queryParams: { returnUrl: state.url } });
}
canLoad(route: import("@angular/router").Route, segments: import("@angular/router").UrlSegment[]): boolean | Observable<boolean> | Promise<boolean> {
if (this.contextSvc.isAuthorized()) {
if(this.contextSvc.isUserAdmin()) return true;
else {
this.router.navigateByUrl('/user');
return false;
}
} else {
this.router.navigateByUrl('/login');
return false;
}
}
}
В этом случае перенаправление «входа» изнутри canLoad не работает
Я также пытался использовать дочерний подход с пустым путем, в котором защита
canActivate была установлена на родительском маршруте, а защита
canLoad была установлена на дочернем пути с пустым путем. Но похоже, что распознаватель маршрутов работает снизу.
Как я понимаю, это было бы довольно распространенным явлением во многих приложениях, но я не смог найти конкретного решения. Любая помощь?