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
| Papel | Permissões | Uso típico |
|---|---|---|
| ADMIN | Todas as 17 permissões | Administrador do sistema |
| CHAMADOR | attendance, students.search | Chamada de presença |
| RELATORIOS | reports, students.search | Consulta de relatórios |
| CADASTRO | students.add, students.search, sessions.add, sessions.edit, nuclei.manage, classes.manage | Cadastro de alunos e gestão de turmas |
Matriz de permissões
Attendance (Chamada)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
attendance | ✅ | ✅ | ❌ | ❌ |
Students (Alunos)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
students.add | ✅ | ❌ | ❌ | ✅ |
students.edit | ✅ | ❌ | ❌ | ❌ |
students.delete | ✅ | ❌ | ❌ | ❌ |
students.search | ✅ | ✅ | ✅ | ✅ |
Users (Usuários)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
users.view | ✅ | ❌ | ❌ | ❌ |
users.create | ✅ | ❌ | ❌ | ❌ |
users.edit | ✅ | ❌ | ❌ | ❌ |
users.deactivate | ✅ | ❌ | ❌ | ❌ |
users.resetPassword | ✅ | ❌ | ❌ | ❌ |
Settings
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
settings | ✅ | ❌ | ❌ | ❌ |
Import/Export
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
import-export | ✅ | ❌ | ❌ | ❌ |
Sessions (Sessões de aula)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
sessions.add | ✅ | ❌ | ❌ | ✅ |
sessions.edit | ✅ | ❌ | ❌ | ✅ |
Nuclei (Núcleos)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
nuclei.manage | ✅ | ❌ | ❌ | ✅ |
Classes (Turmas)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
classes.manage | ✅ | ❌ | ❌ | ✅ |
Reports (Relatórios)
| Permissão | ADMIN | CHAMADOR | RELATORIOS | CADASTRO |
|---|---|---|---|---|
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:
falsepara papéis customizados (papéis built-in têmisSystem: true)
Papéis dinâmicos são gerenciados exclusivamente por usuários com permissão users.create / users.edit (ADMIN).
Schema do papel
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.
export const PERMISSIONS = {
// ... papéis existentes ...
NOVO_PAPEL: ["attendance", "reports"],
} as const;