Как иметь дочерние маршрутизаторы Aurelia с их собственным шагом авторизации


У меня есть два дочерних маршрутизатора, один для доступа администратора, а другой для общего доступа На общедоступных маршрутах доступа добавлен параметр AuthorizeStep, который проверяет, вошел ли пользователь в систему.

Доступ администратора использует другую аутентификацию, поэтому, чтобы проверить, аутентифицирован ли пользователь администратора, мне нужно сделать другую проверку.

Мое приложение.ts с" родительскими " маршрутами:

 configureRouter(config, router) {
    config.title = 'My site';
    config.addPipelineStep('authorize', AuthorizeStep);
    config.map([
      { route: '', redirect: 'Public' },
      { route: 'Public', moduleId: 'public/views/home', name:'public', title: 'Public Portal - Home' },
      { route: 'Admin', moduleId: 'admin/home', name:'admin', title: 'Admin - Home' }
    ]);

    this.router = router;
  }
}

Общий дочерний маршрутизатор выглядит примерно так:

configureRouter(config, router) {
    config.map([
        { route: '', moduleId: './home', name: 'home', title: 'Home', auth: true },
        { route: 'login', moduleId: './login', name: 'login', title: 'Login' },
        { route: 'page2/:id', moduleId: './page2', name: 'page2', title: 'Page 2', auth: true }
    ]);

    this.router = router;
 }

Где находятся маршруты home и page 2 опознанный.

Дочерний маршрутизатор администратора выглядит примерно так:

configureRouter(config, router) {
        config.map([
            { route: 'page1', moduleId: './page1/home', name: 'page1', title: 'page 1', auth: true },
            { route: 'page2', moduleId: './page2/home', name: 'page2', title: 'page 2', auth: true }
        ]);

        this.router = router;
  }

Только с аутентифицированными маршрутами. Я хотел бы иметь возможность сделать что-то вроде:

configureRouter(config, router) {
        config.addPipelineStep('authorize', AdminAuthorizeStep);
        config.map([
            { route: 'page1', moduleId: './page1/home', name: 'page1', title: 'page 1', auth: true },
            { route: 'page2', moduleId: './page2/home', name: 'page2', title: 'page 2', auth: true }
        ]);

        this.router = router;
  }

Где addPipelineStep происходит на дочернем маршрутизаторе, а не на родительском маршрутизаторе, но это не работает, или я не смог заставить это работать, это вообще возможно? Или я могу иметь только один AuthorizeStep и обрабатывать логику внутри него, чтобы определить, имеет ли его администратор или публичный пользователь доступ к маршруту?

1   2   2017-04-27 13:18:58

1 ответ:

Кажется, что это невозможно для дочерних маршрутизаторов. В Аурелии-маршрутизатор.js:

if (pipelineSteps.length) {
  if (!router.isRoot) {
    throw new Error('Pipeline steps can only be added to the root router');
  }
...

И я действительно получаю ошибку в моей консоли: ERROR [app-router] Error: Pipeline steps can only be added to the root router