diff --git a/src/Profesor/profesor.controller.ts b/src/Profesor/profesor.controller.ts index a9c74c8..b15f262 100644 --- a/src/Profesor/profesor.controller.ts +++ b/src/Profesor/profesor.controller.ts @@ -1,12 +1,17 @@ -import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, Put, Query } from '@nestjs/common'; +import { Body, Controller, Delete, Get, Param, ParseIntPipe, Post, Put, Query,UseGuards } from '@nestjs/common'; import { ProfesorService } from './profesor.service'; import { profesorDto } from './dto/profesorDto.dto'; +import {Roles} from '../permissions/roles.decorator' +import {RolesGuard} from '../permissions/roles.guard' +import {Role} from '../permissions/role.enum' @Controller('profesor') +@UseGuards(RolesGuard) export class ProfesorController { constructor(private profesorService: ProfesorService) {} @Post() + @Roles(Role.Responsable,Role.Admin) async register(@Body() data: profesorDto) { return this.profesorService.register(data); } @@ -25,11 +30,13 @@ export class ProfesorController { } @Put(':id_profesor') + @Roles(Role.Responsable,Role.Admin) async postModify(@Param('id_profesor', ParseIntPipe) id_profesor: number, @Body() data: profesorDto) { return this.profesorService.modify(id_profesor, data); } @Delete(':id_profesor') + @Roles(Role.Responsable,Role.Admin) async remove(@Param('id_profesor', ParseIntPipe) id_profesor: number) { return this.profesorService.remove(id_profesor); } diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index ba3d900..8a3aca8 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -14,9 +14,13 @@ import { import { AuthGuard } from './auth.guard'; import { AuthService } from './auth.service'; import { registerDto } from './dto/registerDto.dto'; -import { UserDto } from 'src/users/dto/userDto.dto'; +import {Roles} from '../permissions/roles.decorator' +import {RolesGuard} from '../permissions/roles.guard' +import {Role} from '../permissions/role.enum' + @Controller('auth') +@UseGuards(RolesGuard) export class AuthController { constructor(private authService: AuthService) {} @@ -25,8 +29,10 @@ export class AuthController { async signIn(@Body() data: registerDto) { return this.authService.signIn(data); } - //@UseGuards() + + @UseGuards() @Post("register") + @Roles(Role.Admin) async register(@Body() data: registerDto){ return this.authService.register(data) } @@ -37,14 +43,16 @@ export class AuthController { return req.user; } - //@UseGuards(AuthGuard) + @UseGuards(AuthGuard) @Put('Modificacion/:id') + @Roles(Role.Admin) async update(@Param('id') userId: number, @Body() data: registerDto) { return this.authService.update(userId, data); } - //@UseGuards(AuthGuard) + @UseGuards(AuthGuard) @Delete('Borrado/:id') + @Roles(Role.Admin) async remove(@Param('id') id: number) { await this.authService.remove(id); return { message: 'User successfully deleted' }; diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 5b88f77..6f38131 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -49,9 +49,11 @@ export class AuthService { if (!checkPassword) { throw new UnauthorizedException('Invalid password'); } + const payload = { idUser: user.id_usuario, username: user.usuario, + permissions: user.id_tipo_usuario, }; const token = this.jwtService.sign(payload); diff --git a/src/permissions/role.enum.ts b/src/permissions/role.enum.ts new file mode 100644 index 0000000..a6ac7e4 --- /dev/null +++ b/src/permissions/role.enum.ts @@ -0,0 +1,5 @@ +export enum Role { + Admin = '1', + Responsable = '2', + } + \ No newline at end of file diff --git a/src/permissions/roles.decorator.ts b/src/permissions/roles.decorator.ts new file mode 100644 index 0000000..b687140 --- /dev/null +++ b/src/permissions/roles.decorator.ts @@ -0,0 +1,5 @@ +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/permissions/roles.guard.ts b/src/permissions/roles.guard.ts new file mode 100644 index 0000000..a1fb47c --- /dev/null +++ b/src/permissions/roles.guard.ts @@ -0,0 +1,30 @@ +// roles.guard.ts + +import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common'; +import { Reflector } from '@nestjs/core'; +import { Role } from './role.enum'; +import { ROLES_KEY } from './roles.decorator'; // Asegúrate de importar el decorador correcto + +@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(); + + if (!user || !user.roles || user.roles.length === 0) { + return false; + } + + return requiredRoles.some(role => user.roles.includes(role)); + } +}