Угловая 2 Как применять несколько гвардейцев с помощью or-Relationship на том же пути

Мое приложение позволяет получить доступ к содержимому на основе ролей пользователя. Я написал Router Guard для каждой роли. Некоторое содержимое разрешает доступ для role1 или role2 или role3. Как написать объявление canActivate в файле feature-routing.module.ts? Как я понимаю, если я напишу

canActivate:[Role1Guard, Role2Guard, Role3Guard]

Доступ будет отклонен, если какой-либо из охранников вернет false. Но в моем случае я должен разрешить доступ, если какой-либо из охранников вернется. Как это сделать? Спасибо заранее!

Ответ 1

В этом случае мы можем создать Master Guard, который будет запускать защиту приложений в соответствии с нашим требованием.

Проверьте этот ответ, чтобы понять подход.

Предполагая, что вы прошли через ссылку выше, подход в этом случае может быть таким же простым, как изменение свойства data в классе Route.

Что-то вроде этого -

{
    path: "view2",
    component: View2Component,
    //attach master guard here
    canActivate: [MasterGuard],
    //this is the data object which will be used by 
    //masteer guard to execute guard1, guard 2, guard 3 & guard 4
    data: {
        trigger: {
            operator: "OR",
            guards: [
                GUARDS.GUARD1,
                GUARDS.GUARD2,
                GUARDS.GUARD3,
                GUARDS.GUARD4
            ]
        }
    }
}

И затем используйте флаг operator чтобы соответствующим образом запустить все охранники.

Надеюсь, это поможет :)

Ответ 2

Вы можете написать OrGuard, что-то вроде:

class OrGuard() {
  guards: any[];
  constructor(...guards) { this.guards = guards }

  canActivate() {
    return this.guards.some(Boolean);
  }
}

и используйте его так:

canActivate:[new OrGuard(Role1Guard, Role2Guard, Role3Guard)]

... просто идея, фактическая реализация может быть другой, я не пытался (;