Skip to content

Permissões (RBAC)

O Neemias implementa controle de acesso baseado em papéis (RBAC — Role-Based Access Control) com 4 papéis integrados e 17 permissões granulares. A partir da versão v0.26.0, papéis dinâmicos podem ser criados e gerenciados via API.

O pacote @neemias/permissions é a fonte única da verdade — tanto o frontend (Vite) quanto o Worker (Wrangler) importam as definições deste pacote.

Papéis integrados

PapelPermissõesUso típico
ADMINTodas as 17 permissõesAdministrador do sistema
CHAMADORattendance, students.searchChamada de presença
RELATORIOSreports, students.searchConsulta de relatórios
CADASTROstudents.add, students.search, sessions.add, sessions.edit, nuclei.manage, classes.manageCadastro de alunos e gestão de turmas

Matriz de permissões

Attendance (Chamada)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
attendance

Students (Alunos)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
students.add
students.edit
students.delete
students.search

Users (Usuários)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
users.view
users.create
users.edit
users.deactivate
users.resetPassword

Settings

PermissãoADMINCHAMADORRELATORIOSCADASTRO
settings

Import/Export

PermissãoADMINCHAMADORRELATORIOSCADASTRO
import-export

Sessions (Sessões de aula)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
sessions.add
sessions.edit

Nuclei (Núcleos)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
nuclei.manage

Classes (Turmas)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
classes.manage

Reports (Relatórios)

PermissãoADMINCHAMADORRELATORIOSCADASTRO
reports

Papéis dinâmicos (v0.26.0+)

Além dos 4 papéis built-in, o sistema suporta papéis dinâmicos criados via API. Cada papel dinâmico possui:

  • name: identificador único (ex.: "SUPERVISOR")
  • displayName: nome amigável (ex.: "Supervisor Regional")
  • permissions: array de strings com as permissões concedidas
  • isSystem: false para papéis customizados (papéis built-in têm isSystem: true)

Papéis dinâmicos são gerenciados exclusivamente por usuários com permissão users.create / users.edit (ADMIN).

Schema do papel

ts
interface Role {
  name: string; // min 1, max 50
  displayName: string; // min 1, max 100
  permissions: string[];
  isSystem: boolean;
  createdAt: string; // ISO 8601 datetime
  updatedAt: string; // ISO 8601 datetime
}

Como adicionar um novo papel

Adicione uma entrada no map PERMISSIONS em packages/permissions/index.ts. O tipo UserRole é derivado automaticamente — sem definição de tipo separada para manter.

ts
export const PERMISSIONS = {
  // ... papéis existentes ...
  NOVO_PAPEL: ["attendance", "reports"],
} as const;

Fonte: packages/permissions/index.ts

Distribuído sob licença MIT.