Voici mon avis à ce sujet et une solution possible au problème du fournisseur manquant.
Dans mon cas, nous avons un garde qui prend une permission ou une liste d'autorisations comme paramètre, mais c'est la même chose d'avoir un rôle.
Nous avons une classe pour traiter avec les gardes d'authentification avec ou sans permission:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Cela concerne la vérification de la session active de l'utilisateur, etc.
Il contient également une méthode utilisée pour obtenir un garde d'autorisation personnalisé, qui dépend en fait de AuthGuardService
lui - même
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;
}
Cela nous permet d'utiliser la méthode pour enregistrer des gardes personnalisés en fonction du paramètre d'autorisations dans notre module de routage:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
La partie intéressante de forPermission
est AuthGuardService.guards.push
- cela garantit essentiellement qu'à tout moment forPermissions
est appelé pour obtenir une classe de garde personnalisée, il la stockera également dans ce tableau. Ceci est également statique sur la classe principale:
public static guards = [ ];
Ensuite, nous pouvons utiliser ce tableau pour enregistrer tous les gardes - ce n'est pas grave tant que nous nous assurons qu'au moment où le module d'application enregistre ces fournisseurs, les routes ont été définies et toutes les classes de garde ont été créées (par exemple, vérifiez l'ordre d'importation et gardez ces fournisseurs aussi bas que possible dans la liste - avoir un module de routage aide):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
J'espère que cela t'aides.