Class BearerTokenGuard

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

@Context public class BearerTokenGuard extends Object
Guarda de boot do Bearer inbound: app.api-token declarado e vazio recusa o boot.

Sem esta guarda, o par feature ligada + token vazio passa em silêncio e o efeito é indisponibilidade, não auth-bypass: o StaticBearerTokenValidator é fail-closed, logo /api/** responde 401 a tudo enquanto o app sobe healthy — o sintoma chega horas depois como "a integração parou", sem nada no boot apontando a causa. É a mesma classe de misconfig do placeholder não resolvido, que a 0.5.1 já trata como fatal; ter os dois com tratamentos opostos era incoerente.

Como a lib sabe que a feature está ligada: pela presença da property, não por uma flag nova. Declarar o token é declarar a feature — app.api-token: ${APP_API_TOKEN:} com a env ausente resolve para "" e cai aqui; app que não usa Bearer simplesmente não declara a property e segue com o validador dormente, boot intacto. Uma flag paralela (bearer.enabled) seria uma segunda fonte de verdade capaz de discordar da primeira, e um @Requires(pattern = ".+") no validador faria o bean sumir em silêncio — mesmo sintoma de antes, sem nem um bean para culpar.

@Context, não @Singleton: singleton é lazy e a guarda só dispararia quando alguém resolvesse o bean (possivelmente no primeiro request). Guarda de boot tem de ser eager.

Tolerância: em dev/test, ou com micronaut.security.enabled=false, o token vazio só loga WARN — senão todo dev sem a env exportada perde o boot local.

Promovida do ApiTokenGuard do webstorm-ecom (ADR 0019): o app que adotar esta versão remove o guard local no mesmo PR, senão os dois coexistem.

  • Constructor Details

    • BearerTokenGuard

      public BearerTokenGuard(@Value("${app.api-token:}") String apiToken, @Value("${micronaut.security.enabled:true}") boolean securityEnabled, io.micronaut.context.env.Environment environment)
      Verifica a configuração do Bearer no startup do contexto.
      Parameters:
      apiToken - valor resolvido de app.api-token (default vazio quando ausente).
      securityEnabled - valor de micronaut.security.enabled (default true).
      environment - ambiente Micronaut: diz se a property foi declarada e se o perfil é dev/test.