Pular para conteúdo

0025 — Login servida pela lib

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-09-15 · Decidido em: 2026-09-10

Contexto

Este RD não decide nada novo: a tela de login servida pela lib é norma da casa (constituição §5, decisão central 0032, constituição 1.4.0). O que faltava aqui era o rastro local — quando e como este app adotou.

A frota tinha cinco login.jte copiados — e o duplicado era o que não deveria: mecanismo de auth idêntico (mesmo SDK, mesmo popup, mesmo callback com CSRF), moldura divergente. Um bug de auth custava 5 PRs. A xadm-seguranca passou a servir a view (xadm/login, sob namespace — sem colisão de FQCN com a view do app) e o app configura marca/tagline/título por property.

Decisão

Adota a login da lib com o bump xadm-seguranca 0.6.1 → 0.7.2, no mesmo PR (bumpar é migrar, constituição §5):

  • Apaga src/main/jte/login.jte — o XadmLoginController da 0.7.2 renderiza xadm/login do próprio JAR (GET /login, POST /login/callback e POST /logout inalterados).
  • Preserva a identidade que a view local tinha, por property (título vazio = derivado do app-nome, decisão 0032):
xadm:
  views:
    app-nome: "BI Comercial"
    login:
      marca: true
      tagline: "Um ERP Completo para sua empresa"
      rodape: "BI Comercial · Processador XLS"

Três consequências locais, com o porquê:

  • A view da lib linka os paths do kit (/css/bootstrap.min.css, /js/bootstrap.bundle.min.js). Isso forçou o fim da divergência deliberada do vendor local (/public/vendor/bootstrap-5.3.3): manter os dois seria servir dois Bootstrap — o da lib quebraria sem os paths do kit. O app adota os estáticos do kit verbatim (Bootstrap 5.3.8) e o layout.jte volta aos paths do kit. Sem o /js/** anônimo (intercept-url-map + ViewWhitelist), o bundle responderia 401 justo na tela de login (lição da constituição 1.4.1).
  • BearerTokenGuard (fail-fast, constituição 1.4.7). app.api-token declarado-e-vazio agora recusa o boot em vez de subir healthy respondendo 401 a tudo — a classe de indisponibilidade silenciosa que a camada 2 do smoke existe para pegar do lado de fora.
  • Seam destravado, não ligado. A 0.7.2 traz o POST /smoke/session (dormindo por @Requires sem smoke.token); rota session/m2m no manifesto continua deferida — falta SMOKE_TOKEN no secret e a property no recurso Coolify (RD 0024).

Correção (2026-09-15): o manifesto declara a rota session (GET /processamentos) e a m2m; o seam liga com o SMOKE_TOKEN no recurso (RD 0024).

Consequências

  • Prova no mesmo passo: o AuthIntegrationTest (GET /login com "Entrar com Google" + CSRF double-submit contra a página) agora exercita a view da lib — é o e2e-local pegando o drift de contrato da adoção, como manda a §5.
  • Estáticos travados por teste (java-micronaut §UI, constituição 1.4.1): o EstaticosDoKitAnonimosTest extrai os href/src do kit/layout.jte e do HTML do GET /login e afirma 200 sem credencial em cada um, com o contexto real. Controle vermelho feito: sem /js/** no intercept-url-map, reprova.
  • Este RD é ponteiro: divergência de mérito sobre o mecanismo se resolve na central 0032, não aqui. O que se decide localmente é a identidade (marca/tagline/rodapé) e o quando.