Autorização automatizada

· Padrão Frontend
Juan Kalleo
Juan Kalleo
Senior Fullstack
This page hasn't been translated to English yet — showing the original Portuguese content.

O OWASP Authorization Testing Automation Cheat Sheet propõe um formato específico pra testar RBAC sem que o teste vire um peso morto a cada mudança de permissão: formalizar uma matriz de autorização (papel × recurso × ação → permitido/negado) num arquivo estruturado, gerar os testes a partir dela, um teste por papel, rodando em todo release — pra pegar regressão de permissão automaticamente, sem alguém ter que lembrar de testar manualmente toda combinação depois de mexer no RBAC.

No padrão frontend

Não se aplica ao front diretamente — é um padrão de teste do backend (a autoridade real de autorização é a API, ver IDOR e autorização). Documentado aqui porque a lacuna encontrada na API é exatamente o que essa técnica resolveria.

Hoje existe um teste real de negação (api/test/models/ability_test.rb), mas ele testa Ability#cannot? diretamente em memória — não uma matriz formal, não gerado a partir de uma definição estruturada, e não rodando contra rota HTTP real. Nenhum dos 16 arquivos de teste de controller (api/test/controllers/api/v1/admin/*_controller_test.rb) usa outro usuário além do admin wildcard — não existe hoje "um teste por papel" verificando que cada combinação papel×recurso×ação se comporta como o RBAC (a_papeis/a_permissoes/a_papeis_permissoes) diz que deveria.

Por que isso importa mais aqui do que num RBAC hardcoded: este projeto já decidiu que autorização nasce de dado (registro em a_papeis/a_permissoes), não de can :manage, X escrito à mão no Ability (regra 13 do api/CLAUDE.md, motivada por uma lição real de outro produto do mesmo grupo). Isso é bom — papel novo é dado, não deploy — mas também significa que a autorização pode mudar sem uma mudança de código correspondente (alguém edita a_papeis_permissoes via admin, em produção). Um teste que só verifica "o código do Ability resolve certo hoje" não pega uma alteração de dado que quebra a expectativa amanhã — é exatamente o cenário que uma matriz automatizada, rodando contra a definição real de papéis/permissões, protegeria.

O que a técnica pediria, se implementada (mudança na API): um arquivo de matriz (papel real do sistema × cada recurso admin × ação — CONSULTAR/INCLUIR/EDITAR/EXCLUIR) processável por um script, um teste de integração genérico que itera essa matriz e bate contra a rota HTTP real (não só Ability#cannot?), usando um fixture por "ponto de vista" de papel (não só users(:one)), e falha nomeando exatamente qual combinação papel×recurso×ação violou a matriz.