javascript - Velg AuthGuard-type på farten
Appen min vil bruke to forskjellige autentiseringsstrategier - én for brukere som bruker en nettleser og en annen for offentlig API. Jeg vil sette en header for de som bruker en nettleser, og deretter vil appen min sette autentiseringsstrategien basert på verdien av den header.
Jeg har satt opp de to autentiseringsstrategiene, og gitt dem navn. Jeg kan nå gjøre dette i kontroller-metodene mine:
@Get()
@UseGuards(AuthGuard('strategy_name'))
async find() { }
Det jeg gjerne vil gjøre, er å IKKE måtte spesifisere autentiseringsvakt-typen ved siden av hver kontroller-metode, eller logikken for å bestemme hvilken type som skal brukes. I stedet vil jeg legge denne logikken ett sted, som vil bli lest av ALLE kall til AuthGuard().
Hva er den beste måten å gjøre dette på? Finnes det en slags filter/krok/interceptor for AuthGuard?
Svar #1
Du kan opprette en ny Guard som fungerer som en delegat og velger riktig AuthGuard (og dermed AuthStrategy) basert på din tilstand.
@Injectable()
export class MyAuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
const guard = this.getAuthGuard(context);
return guard.canActivate(context);
}
private getAuthGuard(context: ExecutionContext): IAuthGuard {
const request = context.switchToHttp().getRequest();
// Here should be your logic to determine the proper strategy.
if (request.header('myCondition')) {
return new (AuthGuard('jwt'))();
} else {
return new (AuthGuard('other-strategy'))();
}
}
Bruk det deretter i stedet for standard AuthGuard i kontrolleren din:
@UseGuards(MyAuthGuard)
@Get('user')
getUser(@User() user) {
return {user};
}
