ガードは、リクエストがルートハンドラーに進むことを許可するかどうかを決定します。これはNestJSの認可(および認証チェック)専用のメカニズムです。ガードはリクエストを許可するためにtrueを返すか、ブロックするためにfalseを返すか例外をスローします。
基本的なガード
()
{
(: ): {
request = context.().();
!!request..;
}
}
ガードはcanActivate()を実装します。これはboolean(またはそのPromise/Observable)を返します。falseを返すとリクエストが403でブロックされます。特定の例外(たとえばUnauthorizedException)をスローすることもできます。
@UseGuards(AuthGuard) // on a single route
@Get("profile")
getProfile() {}
@UseGuards(AuthGuard) // on a whole controller (all routes)
@Controller("admin")
export class AdminController {}
app.useGlobalGuards(new AuthGuard()); // globally (all routes)
ガードはメソッド、コントローラー、またはグローバルレベルで適用できます。
@Injectable()
export class JwtAuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const token = request.headers.authorization?.split(" ")[1];
if (!token) throw new UnauthorizedException();
try {
request.user = await this.jwtService.verifyAsync(token); // attach the user
return true;
} catch {
throw new UnauthorizedException("Invalid token");
}
}
}
// a @Roles decorator stores required roles as metadata
@Roles("admin")
@Get("users")
listUsers() {}
// the RolesGuard reads the metadata and checks the user's roles
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(ctx: ExecutionContext): boolean {
const roles = this.reflector.get<string[]>("roles", ctx.getHandler());
const { user } = ctx.switchToHttp().getRequest();
return roles.some(role => user.roles?.includes(role)); // allow if the user has a required role
}
}
@Roles()デコレーター(メタデータ)とそれを読み込むガード(Reflector経由)を組み合わせることが、ロールベースのアクセス制御の標準パターンです。
The ExecutionContext gives guards rich info (the handler, class, request) — more
than plain middleware — which is why guards (not middleware) are the right place
for authorization decisions.
ガードはNestJSの認可を制御するための専用で慣用的なメカニズムです。認証と権限に基づいて、どのリクエストがハンドラーに到達することを許可するかを制御します。
ほぼすべての実際のアプリケーションはルートを保護する必要があるため(ログインを要求し、ロール/権限をチェック)、ガードはこれに対して正しいツールであり、ミドルウェアまたは各ハンドラーに認証ロジックを詰め込むよりもはるかにクリーンです。これを理解することは不可欠です。
標準的なパターン — 認証情報を検証してリクエストにユーザーを割り当てるJWT/認証ガード、および@Roles()デコレーターとReflector読み込みガードを組み合わせたロールベースガード(RBAC用)— はNestJS APIを保護するために基本的です。
ガードが豊富なExecutionContextにアクセスできることは(ターゲットハンドラー、クラス、リクエストを知っている)、ミドルウェアでは適切に行えない認可決定に適しています。
ガードを書く方法、適用方法(メソッド/コントローラー/グローバル)、メタデータデコレーターと組み合わせる方法を知ることは、セキュアなNestJSアプリケーションを構築するためのコア知識であり、フレームワークにおいて頻繁に出現する建築上重要なトピックです。