ARCA implements a hierarchical role-based access control (RBAC) system with four distinct user roles. Each role has specific permissions and access levels that control what users can see and do within the system.
The role system uses a numeric hierarchy where lower numbers indicate higher privileges. This design allows for efficient permission checks throughout the application.
Users can only create accounts with equal or lower privilege levels:
apps/backend/src/users/users.service.ts
async create(createUserDto: CreateUserDto, creator: TokenDto) { // Verifica se o criador tem permissão para criar usuários if ( // 1. A regra geral: proíbe se o novo usuário tiver acesso igual ou superior createUserDto.roleId <= creator.access && // 2. A exceção: a regra acima NÃO se aplica se for um Admin (1) criando outro Admin (1) !(creator.access === 1 && createUserDto.roleId === 1) ) { throw new ForbiddenException( 'Você não tem permissão para criar um usuário com nível de acesso igual ou superior ao seu.', ); } // ... create user}
Special Case: Only Admins can create other Admin accounts. This prevents privilege escalation.
Users can only view accounts with equal or lower privilege levels:
apps/backend/src/users/users.service.ts
async findAll(creator: TokenDto) { // Lista apenas os usuários com nível de acesso menor ou igual ao do criador const users = await this.prisma.usuario.findMany({ where: { roleId: { gte: creator.access, // Greater than or equal to creator's role ID }, }, // ... }); return users;}
Users cannot edit accounts with higher or equal privilege levels (with Admin exception):
apps/backend/src/users/users.service.ts
async update(id: UUID, updateUserDto: UpdateUserDto, creator: TokenDto) { const user = await this.prisma.usuario.findFirst({ where: { id_User: id }, }); // REGRA 1: Você não pode editar um usuário com nível igual ou superior ao seu const canEditUser = creator.access < user.roleId || (creator.access === 1 && user.roleId === 1); if (!canEditUser) { throw new ForbiddenException( 'Você não tem permissão para editar um usuário com nível de acesso igual ou superior ao seu.', ); } // ... update user}
Users cannot change role assignments during updates. Role changes require special administrative procedures to prevent privilege escalation.
Users cannot delete their own account or accounts with higher/equal privilege:
apps/backend/src/users/users.service.ts
async remove(id: UUID, creator: TokenDto) { const user = await this.prisma.usuario.findUnique({ where: { id_User: id }, }); // Você não pode deletar a si mesmo. if (creator.sub === user.id_User) { throw new ForbiddenException('Você não pode deletar sua própria conta.'); } // Você não pode deletar um usuário com nível de acesso igual ou superior. const canDelete = creator.access < user.roleId || (creator.access === 1 && user.roleId === 1); if (!canDelete) { throw new ForbiddenException( 'Você não tem permissão para deletar um usuário com nível de acesso igual ou superior ao seu.', ); } // ... delete user}
The frontend middleware enforces route-level access control:
apps/frontend/middleware.ts
const routePermissions: Record<string, number> = { "/dashboard/usuarios": 2, // Secretário (2) or superior (Admin = 1) "/dashboard/usuarios/criar": 2, // Secretário or superior "/dashboard/usuarios/permissoes": 1, // Apenas Admin};// Verifica se a rota tem restriçõesfor (const [route, maxRoleId] of Object.entries(routePermissions)) { if (pathname.startsWith(route)) { const userRoleId = token?.roleId as number if (!userRoleId || userRoleId > maxRoleId) { // Redireciona para página de acesso negado return NextResponse.redirect(new URL('/dashboard/unauthorized', req.url)) } }}
Route permissions use maximum role ID values. A user can access a route if their role ID is less than or equal to the specified maximum.
Assign users the minimum role level required for their responsibilities. For example, if someone only needs to supervise estagiários, assign the Supervisor role rather than Secretário.
Regular Permission Audits
Periodically review user roles and permissions to ensure they align with current responsibilities. Remove or downgrade access for users who no longer require elevated privileges.
Secure Admin Accounts
Limit the number of Admin accounts and use strong authentication. Admin accounts have unrestricted access and should be closely monitored.
Document Role Changes
Maintain an audit trail when changing user roles, especially elevating privileges. This helps with compliance and security investigations.