Разумевање чувара у NestJS-у

NestJS, popularan frejmvork za kreiranje efikasnih i skalabilnih Node.js aplikacija, nudi robustan set alata za organizaciju i struktuiranje koda. Među tim alatima, ističu se guardovi, koji igraju ključnu ulogu u implementaciji bezbednosnih mera i validacije u vašem NestJS projektu.

Šta su Guardovi?

Guardovi u NestJS-u su specijalizovane klase koje se pozivaju pre obrade bilo kog zahteva. Njihov zadatak je da provere da li zahtev ispunjava određene uslove pre nego što se prosledi kontroleru.

Zamislite guardove kao vratare u klubu koji proveravaju da li imate kartu ili odgovarajući dress code pre nego što vas puste unutra.

Tipovi Guardova

NestJS podržava raznovrsne tipove guardova, svaki sa specifičnom funkcionalnošću:

  • HTTP guardovi: Aktiviraju se za svaku HTTP rutu (GET, POST, PUT, DELETE, itd.).
  • HTTP metod guardovi: Primjenjuju se samo na određene HTTP metode, na primjer, isključivo na POST zahteve.
  • Param guardovi: Koriste se za validaciju i obradu parametara u ruti.
  • Query guardovi: Služe za validaciju i obradu parametara u URL-u.
  • Body guardovi: Obavljaju validaciju i manipulaciju podacima u telu zahteva.
  • Custom guardovi: Omogućavaju kreiranje sopstvenih guardova za posebne potrebe.

Kako Kreirati Guarda

Za kreiranje guarda u NestJS-u, potrebno je definisati klasu koja implementira interfejs CanActivate. Ovaj interfejs sadrži metodu canActivate koja vraća boolean vrednost: true ako zahtev može da prođe, false ako ne.


import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class RoleGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    // Proverite ulogu korisnika
    const userRole = request.user.role;

    if (userRole === 'admin') {
      return true;
    }

    return false;
  }
}

Upotreba Guardova

Kontrolere ili rute možete dekorisati guardovima da biste primenili određena pravila.


@Get('admin')
@UseGuards(RoleGuard)
adminRoute() {
  // Kod koji se izvršava samo za administratore
}

Prednosti Korišćenja Guardova

  • Poboljšana sigurnost: Guardovi omogućavaju kontrolu pristupa resursima i sprečavaju neovlašćeni pristup.
  • Validacija ulaznih podataka: Guardovi mogu da provere da li su ulazni podaci validni i ispravno formatirani.
  • Čistiji kod: Logika validacije i autorizacije se premešta u zasebne klase, što čini kod kontrolera jasnijim i lakšim za održavanje.
  • Ponovna upotreba: Guardovi se mogu definisati jednom i koristiti u različitim delovima aplikacije.

Validacija sa Guardovima

Guardovi se takođe mogu koristiti za validaciju podataka iz zahteva. Na primer, da biste proverili da li je korisničko ime u telu zahteva dugo najmanje 5 karaktera, možete upotrebiti sledeći kod:


import { Injectable, CanActivate, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class UsernameGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    const username = request.body.username;

    if (username.length < 5) {
      throw new UnauthorizedException('Username must be at least 5 characters long');
    }

    return true;
  }
}

Zaštita Ruta

Guardovi se mogu koristiti za zaštitu određenih ruta od pristupa neovlašćenih korisnika:


@Get('admin')
@UseGuards(AuthGuard)
adminRoute() {
  // Kod koji se izvršava samo za autentifikovane korisnike
}

Zaključak

Guardovi u NestJS-u su moćan alat za implementaciju sigurnosnih mera i validacije u vašim aplikacijama. Oni vam omogućavaju da kontrolišete pristup resursima, validirate ulazne podatke i obezbedite čistiji i lakši za održavanje kod.

Važno je razumeti različite tipove guardova i kako ih efikasno koristiti u svom projektu. Definisanje sopstvenih guardova za specifične potrebe može vam pružiti dodatnu fleksibilnost i pomoći vam da izbegnete ponavljanje koda.

Često postavljana pitanja

1. Kako da generišem novu rutu sa guardom?
Možete da generišete novu rutu sa guardom koristeći NestJS CLI komandu nest generate controller <ime_kontrolera> --guards <ime_guarda>.

2. Kako da dodam više guardova na rutu?
Možete da dodate više guardova na rutu navodeći ih u nizu u dekoratoru @UseGuards: @UseGuards(AuthGuard, RoleGuard).

3. Kako da kreiram sopstveni guard?
Treba da implementirate interfejs CanActivate i definišete metodu canActivate koja vraća boolean vrednost.

4. Kako da testiram guarda?
Možete da testirate guardove koristeći NestJS testni okvir. Dostupne su različite tehnike za testiranje guardova, kao što je mockovanje zavisnosti.

5. Kako da se nosim sa greškama u guardovima?
Možete da bacite greške u guardovima kako biste ih mogli obraditi u mehanizmu za obradu grešaka.

6. Kako da primenim guardove na više kontrolera?
Možete da definišete zajednički modul koji sadrži guardove koje želite da primenite na više kontrolera.

7. Kako da koristim guardove za autorizaciju?
Guardovi za autorizaciju proveravaju da li korisnik ima dozvolu da pristupi određenom resursu, na osnovu njegovih uloga ili dozvola.

8. Kako da koristim guardove za validaciju ulaznih podataka?
Guardovi za validaciju ulaznih podataka proveravaju da li su podaci u zahtevu validni i ispravno formatirani.

9. Kako da koristim guardove za obradu zahteva?
Guardovi se mogu koristiti za obradu zahteva pre nego što se proslede kontroleru, na primer za dodatno podešavanje podataka.

10. Kako da koristim guardove za obradu odgovora?
Iako guardovi nisu primarno namenjeni za obradu odgovora, možete da koristite Interceptore za tu svrhu.