This commit is contained in:
2024-06-26 11:39:41 -06:00
parent 38b7066ac0
commit bd9adfe7d0
3 changed files with 39 additions and 15 deletions
+6 -2
View File
@@ -7,13 +7,17 @@ import { DatosAcademicosModule } from '../datos_academicos/datos_academicos.modu
import { LineasInvestigacionModule } from '../lineas_investigacion/lineas_investigacion.module';
import { ProyectosAcademicosModule } from '../proyectos_academicos/proyectos_academicos.module';
import { JwtModule } from '@nestjs/jwt';
import { RolesGuard } from '../permissions/roles.guard';
@Module({
imports: [TypeOrmModule.forFeature([Profesor]),
DatosAcademicosModule,
LineasInvestigacionModule,
ProyectosAcademicosModule,
JwtModule,
],
providers: [ProfesorService],
controllers: [ProfesorController],
providers: [ProfesorService,RolesGuard],
controllers: [ProfesorController,RolesGuard],
})
export class ProfesorModule {}
+4 -3
View File
@@ -16,8 +16,6 @@ import { TipoUsuario } from './tipo_usuario/entities/tipo_usuario.entity';
import { ProfesorModule } from './Profesor/profesor.module';
import { Profesor } from './Profesor/entities/profesor.entity';
import { AdscripcionController } from "./adscripcion/adscripcion.controller";
import { AdscripcionService } from "./adscripcion/adscripcion.service";
import { AdscripcionModule } from "./adscripcion/adscripcion.module";
import { EdificioModule } from "./edificio/edificio.module";
import { CategoriaModule } from "./categoria/categoria.module";
@@ -54,7 +52,10 @@ import { CategoriaModule } from "./categoria/categoria.module";
synchronize: true,
}),
}),
ProfesorModule, AdscripcionModule, EdificioModule, CategoriaModule
ProfesorModule,
AdscripcionModule,
EdificioModule,
CategoriaModule,
],
controllers: [AppController],
providers: [AppService],
+29 -10
View File
@@ -3,31 +3,50 @@
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
import { ROLES_KEY } from './roles.decorator';
import { JwtService } from '@nestjs/jwt';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
constructor(
private reflector: Reflector,
private jwtService: JwtService // Inyectar JwtService para verificar tokens JWT
) {}
canActivate(context: ExecutionContext): boolean {
async canActivate(context: ExecutionContext): Promise<boolean> {
const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
context.getHandler(),
context.getClass(),
]);
if (!requiredRoles) {
return true; // Si no hay roles requeridos, se permite el acceso
return true; // Permitir acceso si no se especifican roles requeridos
}
const request = context.switchToHttp().getRequest();
const permissionsHeader = request.headers['permissions'];
const token = this.extractTokenFromHeader(request);
if (!permissionsHeader) {
return false; // Si no hay encabezado 'permissions', se niega el acceso
if (!token) {
return false; // Denegar acceso si no hay token JWT
}
const userRoles: Role[] = JSON.parse(permissionsHeader);
try {
const payload = await this.jwtService.verifyAsync(token); // Verificar y decodificar el token JWT
const userRoles: Role[] = payload.roles; // Suponiendo que los roles están en el payload del token
return requiredRoles.some(role => userRoles.includes(role));
return requiredRoles.some(role => userRoles.includes(role));
} catch (err) {
return false; // Manejar errores de verificación de token, aquí puedes personalizar la lógica según necesites
}
}
}
private extractTokenFromHeader(request: any): string | null {
const authHeader = request.headers.authorization;
if (authHeader && authHeader.split(' ')[0] === 'Bearer') {
return authHeader.split(' ')[1]; // Devolver solo el token sin 'Bearer '
}
return null;
}
}