Class SmokeSessionController

java.lang.Object
br.com.xadm.comum.seguranca.SmokeSessionController

@Controller("/smoke") @Requires(property="smoke.token",pattern=".+") @Requires(property="auth.session-secret",pattern=".+") public class SmokeSessionController extends Object
Seam do smoke de produção: troca uma credencial dedicada por um cookie de sessão, sem a dança do provedor. O login da casa é Google/Firebase — interativo, logo não automatizável — e sem sessão o smoke só consegue asserção negativa nas rotas logadas (302/401).

Principal próprio, não um usuário real: uid=smoke, email=smoke@<auth.xadm-email-domain> e o papel SessionAuthenticationFetcher.ROLE_SMOKE junto do ROLE_VIEW. Reusar credencial de gente daria mais permissão do que o smoke precisa e apagaria a fronteira entre "quem testou" e "quem opera". O ROLE_VIEW é o que deixa navegar; o SmokeReadOnlyFilter é o que garante só-leitura.

Nasce desligado — @Requires(property = "smoke.token", pattern = ".+") (env SMOKE_TOKEN). ⚠️ pattern, nunca notEquals = "": com a property ausente, o notEquals cai no ramo que devolve true — o bean sobe, o @Value sem default só estoura quando ele é instanciado, e o resultado é 500 no primeiro request com startup verde. O pattern=".+" reprova ausente e declarada-vazia: sem a env o endpoint simplesmente não existe (404).

Rate-limit: o XadmLoginRateLimitFilter cobre /smoke/** junto com /login/** — endpoint que emite sessão a partir de token estático sem freio de brute-force é convite, e a peça já existia. Quem bate aqui sem credencial ainda cai na policy de glitch da comum-web (o 401 sai em log; 404 autenticado e 5xx viram ERROR).

  • Field Details

    • SMOKE_TOKEN_HEADER

      public static final String SMOKE_TOKEN_HEADER
      Header que carrega o SMOKE_TOKEN.
      See Also:
    • SMOKE_UID

      public static final String SMOKE_UID
      sub do JWT do principal de smoke — não é um usuário do Firebase.
      See Also:
  • Constructor Details

    • SmokeSessionController

      public SmokeSessionController(AuthSettings settings, SessionTokenService sessionTokens, @Value("${smoke.token}") String tokenEsperado)
      Cria o seam de sessão do smoke.
      Parameters:
      settings - config de auth (TTL, domínio de email, cookie-secure).
      sessionTokens - emissor do JWT de sessão.
      tokenEsperado - o SMOKE_TOKEN configurado (property smoke.token).
  • Method Details

    • postSession

      @Post(value="/session", produces="application/json") @Secured("isAnonymous()") public io.micronaut.http.HttpResponse<?> postSession(io.micronaut.http.HttpRequest<?> request, @Nullable @Header("X-Smoke-Token") String token)
      Troca o SMOKE_TOKEN por um cookie de sessão só-leitura.
      Parameters:
      request - a requisição (fonte do HTTPS efetivo para o atributo Secure).
      token - valor do header X-Smoke-Token (pode ser null).
      Returns:
      200 {"status":"ok","uid":"smoke"} com o cookie xadm_session, ou 401 em application/problem+json.