Контроль доступа по пути с помощью CanActivate - PullRequest
0 голосов
/ 02 октября 2018

У меня есть приложение, в котором я должен контролировать, к каким маршрутам / путям может обращаться пользователь.Роли не определены, все, что я получаю от 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 правильным способом достижения этого.

...