Autorização e Controle de Acesso Baseado em Papéis (RBAC)
Pilar: 01 — Arquitetura, Stack e Segurança
Status: 🟢 Implementado
Última Revisão Técnica: 2026-08-03
Módulos Conectados:gatein-server(app/core/dependencies.py,app/api/web/auth.py),gatein-web(src/routes/ProtectedRoutes)
1. Visão Geral do Modelo de Permissões
O controle de acesso no ecossistema Gatein é baseado no padrão RBAC (Role-Based Access Control). Cada usuário autenticado (seja via Firebase Auth no Web App ou via JWT no App Mobile) possui um papel de segurança (role) associado que determina os endpoints e recursos que pode manipular.
1.1 Diagrama de Avaliação de Segurança por Requisição
flowchart TD
A[Requisição Ingressante no Server] --> B{Possui Header Auth?}
B -->|Não| C[HTTP 401 Unauthorized]
B -->|Sim| D{Tipo de Token?}
D -->|JWT Mobile| E[Valida JWT Secret + tax_id]
E --> F[get_current_driver]
F --> G{Recurso Pertence ao tax_id?}
G -->|Não| H[HTTP 403 Forbidden]
G -->|Sim| I[Executa Rota Mobile]
D -->|Firebase Bearer| J[Valida Token no Firebase Admin SDK]
J --> K[get_current_admin_company_user]
K --> L{is_active == True?}
L -->|Não| M[HTTP 403 USER_DEACTIVATED]
L -->|Sim| N{Possui Role & Permissão Exigida?}
N -->|Não| H
N -->|Sim| O[Executa Query com Tenant Guard (company_id)]
2. Matriz de Papéis (Roles) e Escopos
| Role | Domínio de Acesso | Descrição | Exemplo de Usuário |
|---|---|---|---|
platform_admin | Global (Cross-Tenant) | Administrador da Plataforma Gatein. Acesso total a todas as empresas, rotas de infraestrutura e /admin/system. | Equipe de Engenharia / Devops |
admin | Tenant Específico | Administrador da Empresa Cliente. Acesso irrestrito dentro da sua company_id (gestão de usuários, API Keys, layouts, geofence). | Gerente de TI do Terminal |
terminal | Operacional Pátio | Operador de Pátio. Acesso a criar agendamentos, visualizar triagem, aprovar/rejeitar check-ins e emitir tickets. | Balancista / Operador de Gate |
transportador | Operacional Frota | Operador de Transportadora. Acesso a visualizar viagens, cadastrar motoristas frotistas e agendar cargas. | Despachante da Transportadora |
driver | App Mobile Apenas | Motorista de Frete. Acesso exclusivo aos agendamentos, tickets e viagens associados ao seu CPF (tax_id). | Motorista de Carreta |
3. Matriz de Permissões por Funcionalidade (CRUD)
| Módulo / Feature | platform_admin | admin | terminal | transportador | driver |
|---|---|---|---|---|---|
Usuários Web (/web/users) | ✅ Criar/Editar | ✅ Criar/Editar | ❌ Sem Acesso | ❌ Sem Acesso | ❌ Sem Acesso |
API Keys (/web/api-key) | ✅ Criar/Revogar | ✅ Criar/Revogar | ❌ Sem Acesso | ❌ Sem Acesso | ❌ Sem Acesso |
Layouts (/web/*-layout) | ✅ Publicar | ✅ Publicar | ⚠️ Apenas Leitura | ❌ Sem Acesso | ❌ Sem Acesso |
Geofence (/web/config) | ✅ Atualizar | ✅ Atualizar | ⚠️ Apenas Leitura | ❌ Sem Acesso | ❌ Sem Acesso |
Appointments (/web/appointments) | ✅ Total | ✅ Total | ✅ Criar/Aprovar | ✅ Criar (Sua Frota) | ⚠️ Apenas os Seus (tax_id) |
| Aprovação Check-in | ✅ Aprovar/Rejeitar | ✅ Aprovar/Rejeitar | ✅ Aprovar/Rejeitar | ❌ Sem Acesso | ❌ Sem Acesso (Dispara apenas) |
Anúncios (/web/announcements) | ✅ Publicar | ✅ Publicar | ⚠️ Apenas Leitura | ❌ Sem Acesso | ⚠️ Visualiza (Gps/Empresa) |
Homologação (/admin/system) | ✅ Acesso Total | ❌ Sem Acesso | ❌ Sem Acesso | ❌ Sem Acesso | ❌ Sem Acesso |
4. Middlewares e Funções de Injeção em dependencies.py
O backend FastAPI implementa verificações de segurança por injeção de dependências:
4.1 get_current_user()
Extrai e valida o Firebase ID Token. Retorna o registro User ou CompanyUser.
4.2 require_permission(resource, action)
Dependency Factory que recebe o nome do recurso (ex: 'geofence', 'users', 'api_key') e a ação ('read', 'write', 'delete').
def require_permission(resource: str, action: str):
def dependency(current_user: CompanyUser = Depends(get_current_user)):
if current_user.role == "admin" or current_user.role == "platform_admin":
return current_user # Bypassed para admins da empresa
if not check_user_has_permission(current_user, resource, action):
raise HTTPException(status_code=403, detail={"code": "INSUFFICIENT_PERMISSIONS"})
return current_user
return dependency
4.3 get_company_context()
Injeta automaticamente o company_id resolvido do usuário autenticado nas queries SQLAlchemy, prevenindo vazamentos Cross-Tenant.
5. Regras de Negócio Explícitas (RN-RBAC-XXX)
RN-RBAC-001: Impossibilidade de Manipulação de Tenant pelo Client
Em nenhum endpoint REST do ecossistema o parâmetro company_id enviado no corpo da requisição ou na query string é utilizado como fonte de autoridade. O company_id é obrigatoriamente resolvido pelo servidor a partir do token verificado.
RN-RBAC-002: Exclusividade de Acesso a Dados do Próprio CPF (tax_id)
No aplicativo mobile, a dependência get_current_driver extrai o CPF do token JWT. Qualquer tentativa de consultar agendamentos, tickets ou viagens informando o ID de outro motorista é bloqueada pelo filtro obrigatorio user_tax_id == current_user.tax_id (retornando HTTP 404/403).
RN-RBAC-003: Bloqueio de Acesso a Operadores Desativados
Usuários com company_users.is_active == False têm o acesso negado em todas as chamadas de API com HTTP 403 (USER_DEACTIVATED), independente da validade do token JWT ou Firebase Auth.
RN-RBAC-004: Restrição Estrita da Rota /admin/system
Endpoints sob o prefixo /admin/system (como geradores de senhas de staging e criação de motoristas fake) exigem incondicionalmente o papel role == "platform_admin". Operadores com papel admin de empresa cliente recebem HTTP 403 ao tentar acionar essas rotas.