У меня есть приложение, в котором я должен контролировать, к каким маршрутам / путям может обращаться пользователь.Роли не определены, все, что я получаю от Backend - это массив путей ( menuSections ), к которым пользователь может получить доступ, поэтому он не может получить доступ к путям, которых нет в массиве.Например, я получаю что-то вроде этого: ['path1', 'path2', 'path3']
.Если пользователь пытается получить доступ к пути, которого нет в массиве, он должен быть перенаправлен на страницу запрещенного доступа.
Я попытался сделать это с помощью CanActivate , но этоне работает, кажется, работает только для первого пути.У меня есть другой сторож ( AuthenticationGuard ) для зарегистрированных пользователей, который отлично работает.
Это код моего сторожа для разрешенных путей пользователя:
@Injectable({providedIn: 'root'})
export class PathGuard implements CanActivate {
constructor(
private menuSectionsService: MenuSectionsService,
private router: Router) { }
canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
return this.menuSectionsService.getMenuSections().pipe(
map(
menuSections => {
const hasAccess = menuSections.some(x => x.link === route.routeConfig.path);
if (!hasAccess) {
this.router.navigate(['denied-access'], { replaceUrl: true });
}
return hasAccess;
}
));
}
}
А это мой app-routing.module.ts :
...
export const routes: Routes = [
...
{ path: path1,
loadChildren: 'app/features/component1.module#Component1Module',
canActivate: [AuthenticationGuard, PathGuard]
},
{
path: path2,
loadChildren: 'app/features/component2.module#Component2Module',
canActivate: [AuthenticationGuard, PathGuard],
},
{ path: path3,
loadChildren: 'app/features/component3.module#Component3Module',
canActivate: [AuthenticationGuard, PathGuard],
},
{ path: PATHS.home, redirectTo: path1, pathMatch: 'full' },
{ path: '**', redirectTo: path1, pathMatch: 'full' }
];
...
Как мне это реализовать?Я не уверен, является ли CanActivate правильным способом достижения этого.