編集
私はAuthenticationとAuthorizationを混ぜていました:私が達成したいのは、ユーザーが認証された後の承認です。
ガードを使用する必要がありました:
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 の戦略に基づいて 3 番目の戦略を作成することでした。
@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 };
}
}
PassportStrategy
「jwt」と区別するために、カスタム名「own」を の 2 番目のパラメータとして渡す方法に注意してください。そのガード:
@Injectable()
export class OwnAuthGuard extends AuthGuard('own') {}
これは機能しますが、それが良い方法なのだろうか...
後で管理者ユーザーのユーザー変更を可能にしたい場合はどうすればよいですか?
をチェックする 4 番目の戦略を作成する必要がありますrole === Role.ADMIN || req.params.id === payload.sub
か?
私は何かが欠けていると思います。jwt のみ、別のものはuserIdのみ、別のものはロールのみを検証する戦略を作成し、ルートにガードを適用するときに必要に応じてそれらを組み合わせる方法があるはずです。