Finaliza roles, add compose

This commit is contained in:
LeoMortari
2025-09-14 01:50:04 -03:00
parent 7b7a666902
commit 63a4a002ec
7 changed files with 105 additions and 15 deletions

View File

@@ -13,27 +13,48 @@ import type { JwtPayload } from './keycloak.strategy';
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {}
private extractRoles(user: JwtPayload): string[] {
const roles: string[] = [];
if (user.realm_access?.roles) {
roles.push(...user.realm_access.roles);
}
if (user.resource_access) {
Object.values(user.resource_access).forEach((resource) => {
if (resource?.roles) {
roles.push(...resource.roles);
}
});
}
return [...new Set(roles)];
}
canActivate(context: ExecutionContext): boolean {
const requiredRoles = this.reflector.getAllAndOverride<string[]>(
ROLES_KEY,
[context.getHandler(), context.getClass()],
);
if (!requiredRoles || requiredRoles.length === 0) {
return true;
if (!requiredRoles || !requiredRoles.length) {
return false;
}
const request = context.switchToHttp().getRequest<{ user: JwtPayload }>();
const user = request.user;
const userRoles: string[] = [
...(user?.resource_access?.clipperia?.roles || []),
];
if (!user) {
throw new ForbiddenException('Usuário não autenticado');
}
const userRoles = this.extractRoles(user);
console.log(context);
const hasRole = requiredRoles.some((role) => userRoles.includes(role));
if (!hasRole) {
throw new ForbiddenException(
'O usuário não possui permissão para acessar esta rota',
'Você não possui permissão para acessar este recurso',
);
}