The-Bugger-Ducks / owl-partners-back

API do projeto "Owl Partners" (5º DSM - 2023, FATEC Profº Jessen Vidal - SJC)
https://owlpartners.onrender.com/api
2 stars 0 forks source link

:sparkles: RBAC authorization #46

Closed GabrielCamargoL closed 1 year ago

GabrielCamargoL commented 1 year ago

Autorização por RBAC (Role Based Access Control)

Print dos resultados obtidos

Usuário SIMPLES ADMIN
image image

Códigos

src/modules/auth/guards/roles.guard.ts

@Injectable()
export class RolesGuard implements CanActivate {
    constructor(private reflector: Reflector) { }

    canActivate(context: ExecutionContext): boolean {
        const requiredRoles = this.reflector.getAllAndOverride<RoleEnum[]>('roles', [
            context.getHandler(),
            context.getClass(),
        ]);
        if (!requiredRoles) {
            return true;
        }
        const { user } = context.switchToHttp().getRequest();

        return requiredRoles.some((role) => user?.role?.includes(role));
    }
}

src/modules/auth/decorators/has-roles.decorator.ts

export const HasRoles = (...roles: RoleEnum[]) => SetMetadata('roles', roles);

Exemplo do uso ao inserir o RBAC em uma rota, ex: deletar usuario

    @HasRoles(RoleEnum.ADMIN)
    @UseGuards(AuthGuard('jwt'), RolesGuard)
    @Delete('/:id')
    async deleteUser(@Param('id') id: string) {
        const userFound = await this.userService.findById(id);
        if (userFound === null) throw new NotFoundException('Usuário não encontrado.')

        return this.userService.delete(id);
    }

Comentários Adicionais

Favor, conferir rotas protegidas com base nos apontamentos dados pela Product Owner: image