ADR-0026 — Gestão central de acesso por perfil no ministério
Status
Section titled “Status”Aprovado
Contexto
Section titled “Contexto”O projeto já possui:
- RBAC com escopo hierárquico (ADR-0003);
- catálogo de papéis por ministério com
hierarchyLevel; - filtragem de visibilidade no frontend para UX (ADR-0024).
Faltava uma gestão central em BD para definir, por perfil, o nível de acesso de cada funcionalidade do ministério com um modelo único.
Decisão
Section titled “Decisão”O backend adota uma matriz central de permissões por ministério, com modelo híbrido:
resourceId(recurso funcional);actionIdopcional (ação específica);accessLevelcom três níveis:FULL— nome amigável:CompletoREAD— nome amigável:LeituraNONE— nome amigável:Nenhum
Regra de herança
Section titled “Regra de herança”Regra oficial: quem pode mais, pode menos.
Na avaliação de acesso:
- Busca regra explícita do papel atual para
resourceId/actionId. - Se não existir, busca regra do mesmo
resourceIdsemactionId. - Se ainda não existir, herda da hierarquia inferior (papéis com
hierarchyLevelmaior), priorizando o nível imediatamente inferior. - Sem regra aplicável, resultado é
NONE.
Autoridade
Section titled “Autoridade”- Backend é autoridade final de autorização.
- Frontend pode usar o resultado apenas para UX.
Regra combinada para Home/Ações
Section titled “Regra combinada para Home/Ações”Para ações exibidas no frontend, aplica-se regra híbrida:
- visibilidade = elegível por
minRole/minHierarchyLevele matrizREAD|FULL; - execução leitura = matriz
READ|FULL; - execução escrita = matriz
FULL; - matriz
NONEimplica ocultar ação na UX e bloquear execução no backend.
Aplicação ao domínio de relatório EBD
Section titled “Aplicação ao domínio de relatório EBD”Para recursos de relatório EBD, a autorização é composta por:
- nível de acesso na matriz (
EBD/LESSON/ATTENDANCE); - papel ativo;
- vínculo operacional (classe/igreja/ministério);
- fase atual do relatório.
Diretriz:
- autorização de papel não substitui validação de vínculo e fase no backend;
- após
ENVIADO, apenas papéis de governança podem executar ações deDEVOLVERouAPROVAR; - papéis operacionais (assistente/professor/superintendente) não editam relatório em estado final.
Rollout
Section titled “Rollout”Enquanto o ministério não possuir matriz em access_matrix/current, o backend pode operar em fallback compatível para evitar quebra de ambiente legado.
Precedência durante migração:
platform/ministrys/{ministryId}/data/access_matrix/current- fallback temporário em
platform/ministrys/{ministryId}/data/user_roles/catalog
Persistência
Section titled “Persistência”Catálogo canônico por ministério (cadastro de recursos/ações e nomes amigáveis):
platform/ministrys/{ministryId}/data/access_catalog/current
O documento current contém:
versionresources[]com:resourceIdresourceNameactions[]com:actionIdactionNamemode(READouWRITE)
updatedAtupdatedBy
Matriz canônica por ministério (somente política por papel):
platform/ministrys/{ministryId}/data/access_matrix/current
O documento current contém:
versionlevels[]comcode+friendlyNameentries[]com:roleIdresourceIdactionId?accessLevelCodeaccessLevelName?
updatedAtupdatedBy
user_roles/catalog permanece como catálogo de papéis/hierarquia.
Separação oficial:
access_catalog/currentdefine o que existe (códigos + nomes amigáveis);access_matrix/currentdefine quem pode o quê.
Gestão operacional
Section titled “Gestão operacional”A edição da matriz deve ocorrer por ação dedicada na Home (“Gerenciar permissões”), consumindo API do backend com validação da própria matriz de acesso:
- leitura:
ACCESS_MATRIX/GET - escrita:
ACCESS_MATRIX/UPDATE
Frontend nunca é autoridade de autorização.
Renderização da UI:
- A UI deve exibir somente nomes amigáveis vindos do backend (
roleDescription,resourceName,actionName,friendlyName). - Códigos técnicos (
roleId,resourceId,actionId,accessLevelCode) são usados para persistência, integração e auditoria.
Cobertura e migração
Section titled “Cobertura e migração”Toda ação de negócio deve passar por backend com validação da matriz.
Enquanto existirem fluxos com acesso direto do cliente ao Firestore (sem gateway), a cobertura de autorização central não é total e deve ser tratada como etapa de migração.
Consequências
Section titled “Consequências”- Permissões deixam de ficar espalhadas por casos de uso isolados.
- Facilita auditoria de acesso por funcionalidade.
- Exige governança do catálogo por ministério.
Referências
Section titled “Referências”- ADR-0003 — Controle de Acesso (RBAC com Escopo Hierárquico)
- ADR-0024 — Controle de visibilidade de ações por perfil
docs/architecture/tdd/api/tdd-gestao-acesso-ministerio.md