Gente eu estou tentando implementar Roles, em um projeto, Segui a documentação, criei o role.enum.ts
export enum Role {
Admin = 'admin',
User = 'user'
}
Criei o role.decorator.ts
import { SetMetadata } from '@nestjs/common';
import { Role} from '../usuario/enum/user.enum';
export const ROLES_KEY = 'roles';
export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);
Criei o role guard
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { ROLES_KEY } from '../../decorators/roles.decorator';
import { Role } from '../../usuario/enum/user.enum';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
context.getHandler(),
context.getClass(),
]);
if (!requiredRoles) {
return true;
}
const { user } = context.switchToHttp().getRequest();
console.error(user)
return requiredRoles.some((role) => user.tipo?.includes(role));
}
}
Como pode ver eu coloquei um console ali no user para ver o que estava acontecendo porque estava chegando 500. E o user esta chegando como undefined
Essa é minha entidade de Usuario
import { IsNotEmpty, IsEmail, MinLength, IsEnum } from "class-validator"
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"
import { Curso } from "../../curso/entities/curso.entity"
import { ApiProperty } from "@nestjs/swagger"
import { Role } from "../enum/user.enum"
@Entity({name: "tb_usuarios"})
export class Usuario {
@PrimaryGeneratedColumn()
@ApiProperty()
public id: number
@IsNotEmpty()
@IsEnum(Role)
@ApiProperty({ enum: Role, default: Role.User })
@Column({
type: 'enum',
enum: Role,
default: Role.User
})
public tipo: Role
@IsNotEmpty()
@ApiProperty()
@Column({length: 255, nullable: false})
public nome: string
@IsEmail()
@IsNotEmpty()
@ApiProperty()
@Column({length: 255, nullable: false })
public usuario: string
@MinLength(8)
@IsNotEmpty()
@ApiProperty()
@Column({length: 255, nullable: false })
public senha: string
@Column({length: 5000 })
@ApiProperty()
public foto: string
@ApiProperty()
@OneToMany(() => Curso, (curso) => curso.usuario)
curso: Curso[]
}
E aqui o controller onde apliquei o decorator de role
@Post()
@Roles(Role.User)
@HttpCode(HttpStatus.CREATED)
create(@Body() categoria: Categoria): Promise<Categoria> {
return this.categoriaService.create(categoria);
}
E por fim meu app module onde eu preciso colocar o provider
@Module({
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRootAsync({
useClass: DevService,
imports: [ConfigModule],
}),
CursoModule,
CategoriaModule,
AuthModule,
UsuarioModule,
JwtModule
],
controllers: [AppController],
providers: [
{
provide: APP_GUARD,
useClass: RolesGuard,
},
],
})
export class AppModule {}
Obrigado desde ja