...

/

Implementing Role-Based Authorization

Implementing Role-Based Authorization

Learn how to implement role-based authorization in NestJS.

Defining AccessControlGuard

After understanding how to retrieve metadata, we pass it to the Roles decorator. Let’s create a dedicated AccessControlGuard responsible for access control in the guards folder.

Press + to interact
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { Role } from 'src/auth/entities/user.entity';
@Injectable()
export class AccessControlGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const roles = this.reflector.getAllAndOverride<Role[]>('roles', [
context.getHandler(),
context.getClass(),
]);
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
return roles.includes(user.role);
}
}

Here is the breakdown of our implementation in the canActivate method:

  • Lines 10–13: The method uses this.reflector.getAllAndOverride(...) to retrieve the role specified in the @Roles decorator at either the controller or method level. For example, if we apply @Roles(Role.Admin) to a method within a controller, the result of this.reflector.getAllAndOverride( ...