Hier ist meine Meinung dazu und eine mögliche Lösung für das fehlende Anbieterproblem.
In meinem Fall haben wir einen Guard, der eine Berechtigung oder eine Liste von Berechtigungen als Parameter verwendet, aber es ist dasselbe, das eine Rolle spielt.
Wir haben eine Klasse für den Umgang mit Auth Guards mit oder ohne Erlaubnis:
@Injectable()
export class AuthGuardService implements CanActivate {
checkUserLoggedIn() { ... }
Dies befasst sich mit der Überprüfung der aktiven Sitzung des Benutzers usw.
Es enthält auch eine Methode zum Abrufen eines benutzerdefinierten Berechtigungsschutzes, die tatsächlich von sich AuthGuardService
selbst abhängt
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;
}
Auf diese Weise können wir die Methode verwenden, um einige benutzerdefinierte Schutzvorrichtungen basierend auf Berechtigungsparametern in unserem Routingmodul zu registrieren:
....
{ path: 'something',
component: SomeComponent,
canActivate: [ AuthGuardService.forPermissions('permission1', 'permission2') ] },
Der interessante Teil von forPermission
ist AuthGuardService.guards.push
- dies stellt im Grunde sicher, dass jedes Mal, wenn forPermissions
eine benutzerdefinierte Schutzklasse aufgerufen wird, diese auch in diesem Array gespeichert wird. Dies gilt auch für die Hauptklasse:
public static guards = [ ];
Dann können wir dieses Array verwenden, um alle Wachen zu registrieren - dies ist in Ordnung, solange wir sicherstellen, dass zum Zeitpunkt der Registrierung dieser Anbieter durch das App-Modul die Routen definiert und alle Wächterklassen erstellt wurden (z. B. Importreihenfolge überprüfen und Halten Sie diese Anbieter in der Liste so niedrig wie möglich - ein Routing-Modul hilft):
providers: [
// ...
AuthGuardService,
...AuthGuardService.guards,
]
Hoffe das hilft.