BE/src/guards/roles.guard.ts

53 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-06-18 17:15:21 +05:30
// roles.guard.ts
import {
CanActivate,
ExecutionContext,
Injectable,
ForbiddenException,
} from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from '../decorators/roles.decorator';
import * as jwt from 'jsonwebtoken';
import { UnauthorizedException } from 'src/exceptions/unauthorized.exception';
2025-07-03 14:35:45 +05:30
import { MailTypeDTO } from 'src/auth/auth.dto';
2025-06-18 17:15:21 +05:30
@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 || requiredRoles.length === 0) return true;
const request = context.switchToHttp().getRequest();
const token = request.cookies?.access_token; // Token is stored as HttpOnly cookie
2025-07-03 14:35:45 +05:30
const body = request.body;
2025-07-03 16:57:37 +05:30
if (body?.P_MAIL_TYPE && body?.P_MAIL_TYPE === MailTypeDTO.FORGOT_PASSWORD) {
2025-07-03 14:35:45 +05:30
return true;
}
2025-06-18 17:15:21 +05:30
if (!token) {
throw new UnauthorizedException('Authentication Failed');
}
try {
const decoded: any = jwt.decode(token);
2025-09-26 12:33:43 +05:30
const roles: string[] = decoded?.resource_access?.[process.env.CLIENT_ID || '']?.roles || [];
2025-06-18 17:15:21 +05:30
const hasRole = requiredRoles.some(role => roles.includes(role));
if (!hasRole) {
throw new ForbiddenException('Unauthorized : Please Request Access for this Resource');
}
return true;
} catch (err: any) {
throw new UnauthorizedException('Authentication Failed');
}
}
}