Ось мій приклад щодо цього та можливе рішення проблеми відсутнього постачальника.
У моєму випадку ми маємо охоронця, який приймає дозвіл або список дозволів як параметр, але це те саме, що має роль.
У нас є клас спілкування з охоронцями з дозволом або без нього:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Це стосується перевірки активного сеансу користувача тощо.
Він також містить метод, який використовується для отримання власного охоронного дозволу, який насправді залежить від самого AuthGuardService
себе
static forPermissions(permissions: string | string[]) {
@Injectable()
class AuthGuardServiceWithPermissions {
constructor(private authGuardService: AuthGuardService) { } // uses the parent class instance actually, but could in theory take any other deps
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
// checks typical activation (auth) + custom permissions
return this.authGuardService.canActivate(route, state) && this.checkPermissions();
}
checkPermissions() {
const user = ... // get the current user
// checks the given permissions with the current user
return user.hasPermissions(permissions);
}
}
AuthGuardService.guards.push(AuthGuardServiceWithPermissions);
return AuthGuardServiceWithPermissions;
}
Це дозволяє нам використовувати метод для реєстрації деяких користувацьких захистів на основі параметра дозволів у нашому модулі маршрутизації:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
Цікавою частиною forPermission
є AuthGuardService.guards.push
- це в основному гарантує, що будь-який час forPermissions
викликається для отримання власного класу охорони, він також буде зберігати його в цьому масиві. Це також статично для основного класу:
public static guards = [ ];
Тоді ми можемо використовувати цей масив для реєстрації всіх охоронців - це нормально, доки ми переконаємось, що до того моменту, як модуль програми реєструє цих постачальників, маршрути були визначені та створені всі класи охорони (наприклад, перевірити порядок імпорту та утримуйте цих провайдерів якомога нижче у списку - наявність модуля маршрутизації допомагає):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
Сподіваюся, це допомагає.