Finaliza roles, add compose
This commit is contained in:
@@ -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',
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user