NestJS Guards Rehberi: Uygulama Güvenliği ve Yetkilendirme
Bu rehberde ne öğreneceksiniz?
Bu rehberde NestJS Guards yapısını uygulamalı öğreneceksiniz.
Guard’ları global, controller ve metot seviyesinde kullanacaksınız.
Bazı rotaları güvenlikten muaf tutmayı öğreneceksiniz.
🧠 Teknik Özet
Konu, NestJS Guards ile yetkilendirmedir.
Problem, yetkisiz erişim riskidir.
Çözüm, istekleri controller’dan önce denetlemektir.
Ön Gereksinimler
- Node.js (v12 ve üzeri)
- VS Code veya benzeri editör
- Postman veya benzeri API istemcisi
- Temel NestJS bilgisi
1. Proje Kurulumu
nest new guvenlik-uygulamasi
cd guvenlik-uygulamasi
npm run start:dev
- Bu komutlar NestJS projesi oluşturur ve geliştirme sunucusunu başlatır.
2. Guard Nedir?
- Guard, isteğin route handler’a ulaşıp ulaşamayacağını belirler.
- Bir güvenlik görevlisi gibi çalışır.
- Controller çalışmadan önce karar verir.
3. API Key AuthGuard Oluşturma
3.1 Guard Dosyası
// src/guards/api-key.guard.ts
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class ApiKeyGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
return request.headers['x-api-key'] === 'RABISU_GIZLI_ANAHTAR';
}
}
- Bu guard, x-api-key başlığını kontrol eder.
4. Guard’ı Controller Seviyesinde Kullanma
import { Controller, Get, UseGuards } from '@nestjs/common';
import { ApiKeyGuard } from './guards/api-key.guard';
@Controller()
@UseGuards(ApiKeyGuard)
export class AppController {
@Get()
getHello(): string {
return 'Korunan Alan';
}
}
- Bu yapı, controller içindeki tüm rotaları korur.
5. Guard Bağlama Seviyeleri
5.1 Global Guard
app.useGlobalGuards(new ApiKeyGuard());
- Bu yapı, tüm uygulamayı korur.
5.2 Metot Seviyesi
@Get('ozel')
@UseGuards(ApiKeyGuard)
ozelAlan() {
return 'Özel Alan';
}
- Sadece ilgili endpoint korunur.
6. Çoklu Guard Kullanımı
6.1 İkinci Guard
// src/guards/kurumsal.guard.ts
import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
@Injectable()
export class KurumsalGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
return request.headers['kurumsal-id'] === '999-RBS';
}
}
- Bu guard, kurumsal kimlik kontrolü yapar.
6.2 Birlikte Kullanım
@Get('kurumsal-panel')
@UseGuards(ApiKeyGuard, KurumsalGuard)
kurumsalPanel() {
return 'Kurumsal Panel';
}
Guard’lar sırayla çalışır.
- Bir tanesi başarısız olursa istek reddedilir.
7. Public Route Tanımlama
7.1 Public Decorator
// src/decorators/public.decorator.ts
import { SetMetadata } from '@nestjs/common';
export const IS_PUBLIC_KEY = 'isPublic';
export const Public = () => SetMetadata(IS_PUBLIC_KEY, true);
- Bu decorator, rotayı herkese açık işaretler.
7.2 Guard İçinde Kontrol
import { Reflector } from '@nestjs/core';
constructor(private reflector: Reflector) {}
const isPublic = this.reflector.getAllAndOverride<boolean>(
IS_PUBLIC_KEY,
[context.getHandler(), context.getClass()],
);
if (isPublic) {
return true;
}
- Bu kod, public rotalarda guard kontrolünü atlar.
7.3 Public Endpoint
@Get('herkese-acik')
@Public()
herkeseAcik() {
return 'Bu rota herkese açık';
}
- Bu endpoint, API anahtarı olmadan çalışır.
Sıkça Sorulan Sorular
-
Guard ile Middleware farkı nedir? Middleware bağlamı bilmez. Guard, handler ve class bilgisini bilir.
-
Guard asenkron olabilir mi? Evet. Promise veya Observable dönebilir.
-
Bir guard veritabanı kullanabilir mi? Evet. Servis enjekte edilebilir.
-
403 hatası özelleştirilebilir mi? Evet. Exception fırlatılabilir.
-
RBAC Guards ile yapılır mı? Evet. Rol kontrolü Guard ile yapılır.
Sonuç
Bu rehberde NestJS Guards yapısını eksiksiz öğrendiniz. API Key, çoklu guard ve public route senaryolarını uyguladınız. Guards, güvenli NestJS uygulamalarının temelidir.
Bu yapıyı Rabisu Bulut altyapısı üzerinde güvenle kullanabilirsiniz.