ื“ืœื’ ืœืชื•ื›ืŸ ื”ืจืืฉื™

Guard System Deep Dive

NestJS guards used for authentication, authorization, and tenant isolation.

Guard Execution Orderโ€‹

Core Guardsโ€‹

TenantPermissionGuardโ€‹

The most commonly used guard. Validates:

  1. User is authenticated (JWT valid)
  2. User belongs to the requested tenant
  3. User has required permissions
@UseGuards(TenantPermissionGuard)
@Permissions(PermissionsEnum.ORG_EMPLOYEES_VIEW)
@Get()
async findAll() {}

RoleGuardโ€‹

Restricts access by user role:

@UseGuards(RoleGuard)
@Roles(RolesEnum.SUPER_ADMIN, RolesEnum.ADMIN)
@Delete(':id')
async delete(@Param('id') id: string) {}

PermissionGuardโ€‹

Checks specific permissions:

@UseGuards(PermissionGuard)
@Permissions(PermissionsEnum.INVOICES_EDIT)
@Put(':id')
async update() {}

OrganizationPermissionGuardโ€‹

Validates organization-level access:

@UseGuards(OrganizationPermissionGuard)
@Get()
async findByOrg() {}

Guard Hierarchyโ€‹

GuardValidatesUsage
AuthGuard('jwt')JWT token validAll endpoints
TenantBaseGuardTenant exists in requestMost endpoints
TenantPermissionGuardTenant + permissionsCRUD operations
RoleGuardUser role matchesAdmin endpoints
PermissionGuardSpecific permissionFeature access
OrganizationPermissionGuardOrg membershipOrg endpoints

Creating Custom Guardsโ€‹

@Injectable()
export class ProjectMemberGuard implements CanActivate {
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest();
const projectId = request.params.projectId;
const userId = request.user.id;

return this.projectService.isMember(projectId, userId);
}
}