diff --git a/src/Operations/operations.controller.ts b/src/Operations/operations.controller.ts index c7fdd6c..af4c3fe 100644 --- a/src/Operations/operations.controller.ts +++ b/src/Operations/operations.controller.ts @@ -21,3 +21,4 @@ export class OperationsController { return this.operationsService.addCredit(data, id_usuario); } } +//IO \ No newline at end of file diff --git a/src/alumno/student.controller.ts b/src/alumno/student.controller.ts index e77f6cc..16af366 100644 --- a/src/alumno/student.controller.ts +++ b/src/alumno/student.controller.ts @@ -1,8 +1,11 @@ -import { Controller, Get, Post, Body, Param } from '@nestjs/common'; +import { Controller, Get, Post, Body, Param, UseGuards } from '@nestjs/common'; import { AlumnoService } from './student.service'; import { CreateStudentDto } from './dto/create-student.dto'; import { Alumno } from './entities/student.entity'; import { JwtAuthGuard } from 'src/user/jwt.guard'; +import { RolesGuard } from 'src/roles.guard'; +import { Roles } from 'src/roles.decorator'; +import { Role } from 'src/role.enum'; @Controller('student') export class AlumnoController { @@ -13,6 +16,7 @@ export class AlumnoController { return this.alumnoService.create(createStudentDto); } + //@UseGuards(JwtAuthGuard) @Get(':id') findOne(@Param('id') id: number) { return this.alumnoService.findOne(+id); diff --git a/src/role.enum.ts b/src/role.enum.ts new file mode 100644 index 0000000..3e7049b --- /dev/null +++ b/src/role.enum.ts @@ -0,0 +1,5 @@ + +export enum Role { + ADMINISTRADOR = 'ADMINISTRADOR', + OPERADOR = 'OPERADOR', +} diff --git a/src/roles.decorator.ts b/src/roles.decorator.ts new file mode 100644 index 0000000..73d8868 --- /dev/null +++ b/src/roles.decorator.ts @@ -0,0 +1,6 @@ + +import { SetMetadata } from '@nestjs/common'; +import { Role } from './role.enum'; + +export const ROLES_KEY = 'roles'; +export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles); diff --git a/src/roles.guard.ts b/src/roles.guard.ts new file mode 100644 index 0000000..a2c96e6 --- /dev/null +++ b/src/roles.guard.ts @@ -0,0 +1,22 @@ + +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { Role } from './role.enum'; +import { ROLES_KEY } from './roles.decorator'; + +@Injectable() +export class RolesGuard implements CanActivate { + constructor(private reflector: Reflector) {} + + canActivate(context: ExecutionContext): boolean { + const requiredRoles = this.reflector.getAllAndOverride(ROLES_KEY, [ + context.getHandler(), + context.getClass(), + ]); + if (!requiredRoles) { + return true; + } + const { user } = context.switchToHttp().getRequest(); + return requiredRoles.some((role) => user.role?.includes(role)); + } +} diff --git a/src/user/jwt.strategy.ts b/src/user/jwt.strategy.ts index 12085fd..99de390 100644 --- a/src/user/jwt.strategy.ts +++ b/src/user/jwt.strategy.ts @@ -5,8 +5,9 @@ import { ExtractJwt, Strategy } from 'passport-jwt'; import { ConfigService } from '@nestjs/config'; export interface JwtPayload { - id: string; + id: number; usuario: string; + role:string; } @Injectable() @@ -23,6 +24,6 @@ export class JwtStrategy extends PassportStrategy(Strategy) { if (!payload || !payload.id || !payload.usuario) { throw new ForbiddenException('Token inválido o corrupto'); } - return { id: payload.id, usuario: payload.usuario }; + return { id: payload.id, usuario: payload.usuario,role:payload.role}; } } diff --git a/src/user/user.service.ts b/src/user/user.service.ts index 054063b..66c2a81 100644 --- a/src/user/user.service.ts +++ b/src/user/user.service.ts @@ -38,7 +38,7 @@ export class UserService { async Login(data: Login, res: Response) { const user = await this.findOneByNameandPassword(data); - const payload = { id: user.id_usuario, usuario: user.usuario }; + const payload = { id: user.id_usuario, usuario: user.usuario, role:user.perfil.perfil}; const token = await this.jwtService.signAsync(payload); res.cookie('token', token, {