Public Markdown Document
Auth/RBAC por App Membership em /api/v1/data
Atualizado em: 2026 02 27
Auth/RBAC por App Membership em /api/v1/data
Atualizado em: 2026-02-27
Objetivo
Garantir isolamento de acesso por app e por papel do usuario em todas as rotas GET/POST/PATCH/DELETE de /api/v1/data/*, com suporte a restricao por propriedade (constraint_property) quando configurada.
Status Atual
Implementado
- Enforce global no BFF Nuxt para toda rota
/api/v1/data/*. - Decisao de acesso central no Laravel via
GET /api/v1/auth/app-access/{appName}. - Aplicacao de constraint por dado nos handlers de:
- listagem;
- lookup;
- dashboard metrics;
- leitura por id;
- update por id;
- delete por id;
- create.
- Suporte a aliases de app (
-e_) na validacao. - Suporte a membership curinga
app='*'no endpointapp-access(acesso global por membership). - Usuarios privilegiados com membership
ownerem todos os apps conhecidos e tambem emtask-board/task_board.
Ajuste de abilities
- Como o schema atual de
usersneste ambiente nao possui colunasroleecustom_abilities, o calculo de abilities globais foi adaptado:- se houver membership ativo
app='*'com roleowner/admin,allAbilities()retorna['*'].
- se houver membership ativo
- Resultado esperado apos novo login:
abilitiesno auth devem incluir*.
Plano Tecnico por Camadas
1) Frontend
- Continuar enviando
auth_token(cookie) e/ouAuthorization: Bearer. - Enviar contexto de
appquando necessario (?app=oux-fastapp-app) em casos ambiguos. - Exibir UX consistente:
401para sessao/token invalido;403para bloqueio de escopo/permissao.
2) Backend (Nuxt BFF)
- Middleware
server/middleware/rbac-data-scope.ts:- intercepta
/api/v1/data/*; - resolve
objecteaction(read/create/update/delete/lookup/metrics); - resolve
apppor query/header/referer + metadata do objeto; - valida no Laravel (
/api/v1/auth/app-access/{app}), com fallback em/api/v1/auth/mepara compatibilidade; - injeta escopo em
event.context.rbacDataScope.
- intercepta
- Utilitario
server/utils/rbac-data-scope.ts:- injeta constraint no
where; - injeta/valida constraint no body de escrita;
- valida registro por
iddentro do escopo; - injeta constraint na query forward para fontes externas.
- injeta constraint no
3) Backend (Laravel API)
- Endpoint
GET /api/v1/auth/app-access/{appName}:- valida membership no app solicitado;
- considera aliases e membership curinga
*; - resolve permissao por role + acao + objeto;
- aplica fallback conservador para leitura quando nao ha matriz de permissao;
- retorna
constraintquando existirconstraint_property.
4) Schema
fastapp_permissiondeve manter convencao de nomes de permissao:objeto-read|create|update|delete,data.read,data:create, etc.
- Para escopo por dono/equipe, preencher
constraint_property(ex.:owner_id,team_id).
5) Dados
fastapp_user_appe a fonte principal de autorizacao por app.- Para acesso total administrado por membership, manter:
- memberships por app com role
owner; ou - membership curinga
app='*'com roleowner.
- memberships por app com role
- Garantir
reference_id/reference_objectquandoconstraint_propertyexigir.
Criterios de Aceite
- Sem token, qualquer rota
/api/v1/data/*retorna401. - Sem membership valido no app (nem curinga
*), retorna403. - Com membership
owner/admin, operacoesPOST/PATCH/DELETEsao permitidas. - Com membership de leitura apenas, escrita retorna
403. - Com
constraint_property, leitura e escrita respeitam o escopo por registro. - Com membership curinga
*roleowner, acesso deve funcionar em app novo sem cadastro manual previo. GET /api/v1/auth/mee login devem refletirabilities: ['*']para usuario com membership curinga*owner/admin (apos novo login/token).
Validacao de Regressao
- Smoke por rota:
GET /api/v1/data/:objectPOST /api/v1/data/:objectGET /api/v1/data/:object/:idPATCH /api/v1/data/:object/:idDELETE /api/v1/data/:object/:idGET /api/v1/data/:object/lookupGET /api/v1/data/:object/dashboard-metrics
- Matriz de papeis por app:
owner/admin/member/viewerxread/create/update/delete.
- Casos de app ambiguo:
- mesmo
objectem apps diferentes com?app=distinto.
- mesmo
- Casos de aliases:
task-boardvstask_board;central-filtrosvscentral_filtros.
- Caso curinga:
- usuario com app
*consegue acessar app nao previamente cadastrado no membership nominal.
- usuario com app
- Fontes externas:
- confirmar forward de constraint e bloqueio por membership.
- Nao regressao funcional:
- envelope legado
{ total, limit, skip, data }preservado.
- envelope legado
Observacoes
- O projeto legado
api-fastapp-cloudnao entra no fluxo ativo. - Base ativa considerada:
laravel-api. - O typecheck global do
lead-nuxtpossui erros preexistentes fora deste escopo; validar regressao focando nas rotas RBAC e no fluxo de auth.