You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

30 lines
987 B

import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from "@nestjs/common";
import { JwtService } from "@nestjs/jwt";
@Injectable()
export class RoleGuard 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("Authorization token is missing");
try {
const decoded = this.jwtService.verify(token, { secret: process.env.JWT_SECRET });
const userRole = decoded.role;
if (userRole !== "admin") {
throw new UnauthorizedException(`You do not have the required role. Current role: ${userRole}`);
}
request.user = decoded;
return true;
} catch (error) {
console.log(error);
throw new UnauthorizedException(error.response);
}
}
}