Class SmokeReadOnlyFilter

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

@Singleton @ServerFilter("/**") @Requires(property="smoke.token", pattern=".+") @Order(39250) public class SmokeReadOnlyFilter extends Object
Faz valer o "só-leitura" do principal de smoke: uma sessão com o papel SessionAuthenticationFetcher.ROLE_SMOKE só pode usar métodos seguros (GET/HEAD/OPTIONS); qualquer escrita vira 403 em RFC-7807.

Por que um filtro, e não um papel separado: o smoke precisa navegar as rotas logadas — é o que ele testa —, então o principal tem de carregar o ROLE_VIEW que as regras de view dos apps exigem. Com o ROLE_VIEW vem, de graça, o poder de escrever. O corte por método devolve a fronteira sem obrigar cada app a reescrever suas regras de segurança.

⚠️ A garantia é por VERBO, não por efeito. O filtro assegura "não escreve por método HTTP" — não "não causa efeito". Um @Get que dispara job, exporta gravando ou incrementa contador passa por ele inteiro. Como o smoke só faz GET, isto é defesa em profundidade sobre um cliente que já é de leitura; não leia como "o smoke não pode causar efeito nenhum". Ver a norma do central (engenharia/smoke-producao §4).

Roda depois da fase de segurança (ServerFilterPhase.SECURITY) — antes dela o SessionAuthenticationFetcher ainda não populou a Authentication e o filtro não veria papel nenhum. Nasce desligado junto do SmokeSessionController: sem smoke.token não existe sessão de smoke a limitar, e o filtro não sobe.

  • Constructor Details

    • SmokeReadOnlyFilter

      public SmokeReadOnlyFilter()
      Construtor padrão.
  • Method Details

    • filter

      @RequestFilter @Nullable public @Nullable io.micronaut.http.MutableHttpResponse<?> filter(io.micronaut.http.HttpRequest<?> request)
      Recusa escrita vinda de uma sessão de smoke.
      Parameters:
      request - a requisição.
      Returns:
      null para seguir o pipeline, ou a resposta 403 quando é escrita de smoke.