ADR-0003 — Controle de Acesso (RBAC com Escopo Hierárquico)
Status
Aprovado
Contexto
O sistema EBDbe opera dentro de uma estrutura organizacional hierárquica composta por:
- Ministério
- Árvore de igrejas autorrelacionadas (
OrganizationalUnitcomparent_unit_id)
Além disso, existem papéis funcionais distintos dentro da Escola Bíblica Dominical (EBD), como:
- Pastor
- Superintendente
- Secretaria
- Professor
- Monitor
- Aluno
O modelo de controle de acesso deve considerar:
- Papel do usuário (função)
- Unidade organizacional vinculada
- Nível hierárquico de visibilidade
Um modelo simples de RBAC tradicional (baseado apenas em papel) não é suficiente.
Decisão
O sistema adotará modelo de controle de acesso baseado em:
RBAC (Role-Based Access Control) com Escopo Hierárquico Organizacional.
O acesso será determinado por:
Permissão = Papel + Escopo Organizacional
1. Componentes do Modelo
1.1 Papel (Role)
Define o que o usuário pode fazer.
Papéis, com nível de operação (menor = mais poder):
| Papel | Nível | Descrição |
|---|---|---|
| PLATFORM_ADMIN | -1 | Administrador global da plataforma (cross-tenant, auditado) |
| MINISTRY_ADMIN | 0 | Administrador do ministério |
| MINISTERIAL_EBD_SUPERVISOR | 1 | Supervisor ministerial da EBD |
| PRESIDENT_PASTOR | 1 | Pastor presidente |
| ASSISTANT_MINISTERIAL_PASTOR | 1 | Pastor auxiliar ministerial |
| LOCAL_SECRETARY | 2-3 | Secretário(a) da igreja local |
| EBD_SUPERINTENDENT | 2-3 | Superintendente da EBD |
| ASSISTANT_LOCAL_PASTOR | 2-3 | Pastor auxiliar local |
| LOCAL_PASTOR | 2-3 | Pastor local |
| EBD_SECRETARY | 4 | Secretário(a) da EBD |
| EBD_TEACHER | 5 | Professor da EBD |
| EBD_ASSISTENT | 6 | Assistente de classe |
| CHURCH_LEADER | 6 | Líder na igreja |
| EBD_STUDENT | 7 | Aluno da EBD |
| MEMBER | 7 | Membro |
| CHURCH_WORKER | 7 | Obreiro da igreja |
| NONE | — | Nenhum |
Os papéis determinam permissões funcionais. Um usuário pode possuir múltiplos papéis (via RoleAssignment), cada um com status de aprovação (APPROVED | REJECTED | DECLARED | PENDING). Apenas papéis com status APPROVED são considerados válidos para autorização.
Para PLATFORM_ADMIN, o escopo é global de plataforma, porém ações em dados ministeriais exigem target_ministry_id explícito e auditoria obrigatória (ADR-0012).
1.2 Tipo de Acesso (AccessType)
Para cada combinação Papel + Recurso/Funcionalidade, define-se o tipo de operação permitida:
- READ — visualização
- INSERT_UPDATE — criação e edição
- DELETE — exclusão
- NONE — sem acesso
A validação no backend verificará Papel + AccessType + Escopo Organizacional.
1.3 Escopo Organizacional (Scope)
Define onde o usuário pode atuar.
O escopo estará vinculado a (conforme entidades do ADR-0005):
- ministry_id
- unit_id (referência a OrganizationalUnit)
- relação hierárquica entre unidade do ator e unidade alvo (SAME | ANCESTOR | DESCENDANT | UNRELATED)
- host/domain da requisição, quando aplicável (resolução de tenant)
Exemplo:
Um professor (EBD_TEACHER) vinculado a uma unidade:
- Pode registrar aulas (
Lesson) apenas daquela unidade - Não pode visualizar dados de outra unidade fora do seu ramo hierárquico autorizado
- Pode visualizar apenas sua própria ClassGroup
2. Regras Fundamentais
- Toda requisição será validada no backend.
- O frontend nunca será considerado autoridade de permissão.
- O backend verificará:
- Papel (Role)
- ministry_id
- unit_id e relação hierárquica entre unidade de origem e unidade-alvo
- O usuário nunca poderá acessar dados fora do seu escopo.
- Em operações cross-tenant, somente
PLATFORM_ADMINpode atuar, sempre comtarget_ministry_idexplícito e logging de auditoria. - Aprovações de cadastro/atribuição por secretarias só podem ocorrer em unidades sob seu alcance hierárquico ("abaixo dela"), conforme papel e status APPROVED.
3. Hierarquia de Visibilidade
Regras gerais:
- Ministério: visão global de todas as unidades vinculadas.
- Unidade local: visão do próprio contexto e, quando autorizado por papel, das unidades descendentes.
- Unidade descendente: não acessa unidades ancestrais ou ramos paralelos sem autorização explícita.
Não haverá acesso lateral entre ramos não relacionados.
4. Modelo Conceitual Simplificado
User (conforme ADR-0005): ├── ministry_id ├── unit_id ├── name ├── alias_name ├── email ├── status └── roles[] (RoleAssignment) ├── role_id ├── role_status (APPROVED | REJECTED | DECLARED | PENDING) └── last_action_date
Para usuários com escopo ministerial (ex.: MINISTRY_ADMIN), unit_id pode ser nulo.
As permissões serão avaliadas em Cloud Functions, considerando Papel (apenas APPROVED) + AccessType + Escopo.
5. Autenticação
A autenticação será realizada via Firebase Authentication.
As informações de papel e escopo serão armazenadas:
- No Firestore
- Opcionalmente em Custom Claims do Firebase
A validação final sempre ocorrerá no backend.
6. Princípios de Segurança
- Princípio do menor privilégio
- Isolamento por escopo
- Validação obrigatória no backend
- Logs de auditoria para ações sensíveis
Consequências
- Todas as Cloud Functions deverão validar papel e escopo.
- O modelo de dados deve conter ministry_id e unit_id.
- Permissões não poderão ser decididas apenas na interface.
- Alterações no modelo de acesso exigirão novo ADR.
- O backend deve distinguir escopo ministerial de escopo global de plataforma.
- Referência complementar: ADR-0012.