NestJSAdvanced
NestJS Guards & Authorization
@CanActivate, auth guard, role guard, apply — Authentication/Authorization বাংলায়।
13টি অংশবাংলা ভাষায়
Guard request execution-এর আগে decide করে — request এগোবে কি না। এটি authentication/authorization-এর জন্য প্রধান tool।
Auth Guard তৈরি
npm i @nestjs/jwtsrc/auth/auth.guard.tstypescript
typescript
import {
Injectable,
CanActivate,
ExecutionContext,
UnauthorizedException,
} from "@nestjs/common";
import { JwtService } from "@nestjs/jwt";
import { Request } from "express";
@Injectable()
export class AuthGuard implements CanActivate {
constructor(private jwtService: JwtService) {}
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest<Request>();
const token = this.extractToken(request);
if (!token) {
throw new UnauthorizedException("Login প্রয়োজন");
}
try {
const payload = await this.jwtService.verifyAsync(token);
request["user"] = payload; // controller-এ access
} catch {
throw new UnauthorizedException("Invalid token");
}
return true;
}
private extractToken(request: Request): string | undefined {
const [type, token] = request.headers.authorization?.split(" ") ?? [];
return type === "Bearer" ? token : undefined;
}
}Guard Apply করা
import { Controller, Get, UseGuards } from "@nestjs/common";
import { AuthGuard } from "../auth/auth.guard";
@Controller("profile")
@UseGuards(AuthGuard) // পুরো controller protected
export class ProfileController {
@Get()
getProfile(@Req() req: Request) {
return { user: req["user"] };
}
@Get("public")
// এটা কোনো guard ছাড়া ধরে দরকার হলে override
publicEndpoint() {
return { message: "public" };
}
}Role Guard (Custom metadata)
src/auth/roles.decorator.tstypescript
typescript
import { SetMetadata } from "@nestjs/common";
export const ROLES_KEY = "roles";
export const Roles = (...roles: string[]) =>
SetMetadata(ROLES_KEY, roles);src/auth/roles.guard.tstypescript
typescript
import { Injectable, CanActivate, ExecutionContext, ForbiddenException } from "@nestjs/common";
import { Reflector } from "@nestjs/core";
import { ROLES_KEY } from "./roles.decorator";
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<string[]>(
ROLES_KEY,
[context.getHandler(), context.getClass()],
);
if (!requiredRoles) return true;
const { user } = context.switchToHttp().getRequest();
if (!user?.role || !requiredRoles.includes(user.role)) {
throw new ForbiddenException("অনুমতি নেই");
}
return true;
}
}@Controller("admin")
@UseGuards(AuthGuard, RolesGuard)
export class AdminController {
@Get()
@Roles("admin") // শুধু admin
dashboard() {
return { message: "Admin panel" };
}
}Global Guard
// main.ts
const app = await NestFactory.create(AppModule);
app.useGlobalGuards(new RolesGuard());
// app.module-এ providers সেকশনে ensure করুনGuard vs Middleware
Middleware-এর পরে guards চলে — guards-এ ExecutionContext ও reflector/meta-data access পাই, তাই authorization গার্ডেই করা ভালো।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।