РЕДАКТИРОВАТЬ
Я микшировал Аутентификация и Авторизация : что я хочу достичь, это авторизация после проверки подлинности использования .
Я должен был использовать Guard:
own.guard.ts
@Injectable()
export class OwnGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const req = context.switchToHttp().getRequest();
return req.user.id === req.params.id;
}
}
Затем использовать его на моем маршруте:
@Get(':id')
@UseGuards(OwnGuard)
async get(@Param('id') id: string) {
return await this.usersService.get(id);
}
ОРИГИНАЛЬНЫЙ ОТВЕТ
Я создал третью стратегию на основе jwt:
@Injectable()
export class OwnStrategy extends PassportStrategy(Strategy, 'own') {
constructor() {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
secretOrKey: SECRET,
passReqToCallback: true
});
}
async validate(req: Request, payload: { sub: string }) {
if (req.params.id !== payload.sub) {
throw new UnauthorizedException();
}
return { userId: payload.sub };
}
}
Обратите внимание, как я передаю пользовательское имя 'own' как второй параметр PassportStrategy
, чтобы отличить его от 'jwt'. Его охрана:
@Injectable()
export class OwnAuthGuard extends AuthGuard('own') {}
Это работает, но мне интересно, если это хороший способ сделать это ...
Что если позже я захочу изменить пользователя для пользователей с правами администратора?
Должен ли я создать четвертую стратегию, которая проверяет, если role === Role.ADMIN || req.params.id === payload.sub
?
Я думаю, что я что-то упустил. Должен быть способ создать стратегию, которая проверяет только jwt, другую - только userId , другую - только роль, и объединять их, как я хочу, применяя охрану к моим маршрутам.