Por que a tela de login não é autorização
Fazer login prova quem é a pessoa. Não prova o que ela pode fazer. Use duas contas com perfis diferentes para validar páginas, ações e regras de acesso no servidor.
nota runtime
Login confirma identidade. Autorização define permissões. Teste as duas coisas com duas contas reais e verificações repetíveis.
Checklist rápido
- 01Crie duas contas reais com papéis diferentes, como usuário comum e administrador.
- 02Confira se cada conta vê apenas páginas e ações compatíveis com seu papel.
- 03Teste uma página restrita abrindo a URL direto e depois recarregando.
- 04Valide que esconder botão não basta; o servidor também precisa barrar a ação.
- 05Verifique que identificadores públicos do navegador não estão sendo tratados como segredo.
- 06Mantenha credenciais privilegiadas em código só do servidor e fora de prefixes públicos de ambiente.
- 07Revise caminhos públicos, stack fingerprints e segredos expostos no frontend com checagens externas.
- 08Repita o teste após mudanças de papéis, flags de recurso e novos deploys.
Login prova identidade, não permissão
Autenticação é a etapa em que o sistema confirma quem é o usuário. Autorização é a regra que define o que esse usuário pode fazer. A tela de login normalmente cuida só da autenticação. Ela diz que a pessoa entrou com uma conta válida, mas não prova que ela pode abrir o painel administrativo, acessar faturamento, exportar dados ou executar uma ação sensível. Muita equipe de produto confunde essas duas etapas.
Esse detalhe importa porque vários erros de acesso não aparecem no fluxo comum. A interface pode esconder um botão de admin para o usuário comum, mas o backend ainda pode aceitar a requisição se alguém chamar a rota direto. Ao testar, procure regra aplicada de verdade, não só uma tela bonita. Se a proteção existir apenas no front-end, em estado local ou em lógica do navegador, o controle de acesso ainda está fraco.
- ▸Autenticação = confirmar identidade.
- ▸Autorização = liberar ou negar permissão.
- ▸Botão escondido não é segurança.
- ▸A regra precisa existir no servidor.
Teste acesso com duas contas de perfis diferentes
O teste mais prático é usar duas contas com permissões claramente diferentes. Uma deve representar o cliente comum. A outra deve representar alguém com mais acesso, como gerente ou admin. Faça login com a primeira conta e tente abrir todas as páginas e ações sensíveis que deveriam estar restritas. Depois repita tudo com a segunda conta. A ideia é enxergar uma diferença consistente entre o que cada perfil consegue fazer.
Não pare na conferência visual. Tente abrir uma URL restrita direto, recarregar a página depois de remover a navegação e voltar por histórico ou favorito. Se o app mostrar dados ou liberar ações que deveriam estar bloqueadas, o teste ficou incompleto. Controle de acesso bom precisa se comportar igual tanto pelo menu quanto pela digitação direta do endereço.
- ▸Teste uma conta comum e uma conta com mais privilégios.
- ▸Abra páginas restritas diretamente, não só pelo menu.
- ▸Recarregue e volte à página para confirmar o bloqueio.
- ▸Compare o que cada perfil pode ver, editar, exportar ou apagar.
Confirme que o servidor também está barrando
Bloqueio só no cliente ajuda na experiência, mas não basta para segurança. Um usuário curioso pode enviar requisições fora da interface normal. Por isso a autorização precisa ser validada no servidor. Quando uma requisição chegar para um recurso restrito, o servidor deve checar papel, propriedade do dado ou outra regra antes de devolver conteúdo ou alterar qualquer coisa.
Uma forma simples de validar isso é observar se o bloqueio continua consistente. O app não deve vazar conteúdo privado na resposta e nem executar a ação só porque o botão sumiu da tela. Para founders, a regra é direta: se a função é sensível, considere o navegador um ambiente não confiável. O navegador pode mostrar controles, mas não pode ser a autoridade final do acesso.
- ▸Checagem no servidor é obrigatória para ações sensíveis.
- ▸O navegador ajuda, mas não é fonte de confiança.
- ▸Requisições sem permissão devem falhar de forma consistente.
- ▸Conteúdo privado não deve aparecer nem em erro.
Revise exposição pública, segredos e limites de papel
Teste de acesso também inclui o que uma pessoa de fora consegue descobrir sem entrar no sistema. Revise caminhos públicos, stack fingerprints visíveis e qualquer segredo de frontend exposto externamente. Um identificador público do navegador pode existir se tiver permissão bem limitada e não for tratado como segredo. Já credencial privilegiada é outra coisa: ela precisa ficar em código só do servidor e nunca usar prefixos públicos de ambiente. Variável de ambiente não é segredo por definição.
Também vale revisar se os papéis estão separados na prática. Um cliente não deve conseguir inferir rotas só de staff, nomes internos de API ou ações privilegiadas pelo bundle do front-end ou por mensagens de erro. Se algo é só para equipe interna, não deve aparecer na interface pública. O objetivo não é esconder tudo; é manter o que é público inofensivo e o que é privilegiado realmente no servidor.
- ▸Revise caminhos públicos e informações visíveis do frontend.
- ▸Trate identificadores públicos como não secretos e limitados.
- ▸Guarde credenciais privilegiadas apenas no servidor.
- ▸Nunca coloque segredo privilegiado em prefixos públicos de ambiente.
Inclua esse teste no ritual de release
O melhor momento para achar erro de autorização é antes de o cliente ver. Coloque o teste com duas contas no fluxo de release, principalmente depois de mudanças de papel, atualização de permissões, flags de recurso ou criação de ferramentas de admin. Não precisa de processo pesado. Um conjunto curto e repetível já resolve, desde que rode sempre. O ponto é confirmar que as restrições continuam valendo depois de mudanças de código e deploy.
Para quem constrói app com IA, isso pesa ainda mais porque a lógica do produto muda rápido. Se uma feature gerada ou adaptada pela IA criou nova página, rota ou ação, valide quem pode usar antes de lançar. Mantenha o teste simples: uma conta que deve falhar, uma conta que deve passar e uma lista de resultado esperado. Se algo mudar, corrija primeiro a regra no servidor e depois a interface. Autorização bem feita é requisito de produto, não detalhe de acabamento.
- ▸Rode o teste depois de qualquer mudança de permissão.
- ▸Use uma lista simples de passa ou falha para cada conta.
- ▸Corrija a regra no servidor antes de polir a interface.
- ▸Trate autorização como parte da qualidade do release.
FAQ
Tela de login é a mesma coisa que autorização?
Não. Login confirma identidade. Autorização define o que essa identidade pode acessar ou alterar.
Por que testar com duas contas?
Porque duas contas deixam a diferença de permissão clara. Você compara um usuário comum com outro mais privilegiado e confirma se cada um vê só o que deve.
Se o botão estiver escondido, já resolve?
Não. Interface escondida não é segurança. O servidor precisa negar a ação mesmo que alguém acesse a URL ou envie a requisição direto.
Variável de ambiente é sempre segredo?
Não. Variável de ambiente não é segredo automaticamente. Credenciais privilegiadas precisam ficar em código só do servidor e nunca usar prefixes públicos de cliente.