Olá pessoal,
Eu quero configurar um filtro de autenticação no meu gateway, onde eu irei mapear as rotas seguras e aplicarei este filtro a elas; ele irá recuperar o token de autorização e delegar ao serviço auth-ms (serviço que tem a única responsabilidade de validar tokens) para ser validado. O meu problema é que eu não estou conseguindo alcançar o comportamento esperado do meu filtro. A ideia seria quebrar o fluxo de execução caso o request não cumpra algumas regras como: possuir um header Authorization; o valor do token ter "Bearer " na String e etc. De acordo com a regra ele deve lançar uma exception com uma mensagem diferente.
@Component
public class TestFilter extends AbstractGatewayFilterFactory<TestFilter.Config> {
public TestFilter() {
super(Config.class);
}
@Override
public GatewayFilter apply(Config config) {
System.out.println("pre lambda log");
return (exchange, chain) -> {
System.out.println("123 testing");
return chain.filter(exchange);
};
}
public static class Config {
}
}
O mapeamento das rotas está sendo feito através do application.yml:
server:
port: 9092
logging:
pattern:
console: "%msg%n"
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: account-auth-route
uri: lb://auth-ms
predicates:
Path=/auth/**
filters:
- TestFilter
eureka:
instance:
instance-id: "${spring.application.name}:${random.int}"
client:
serviceUrl:
defaultZone: http://localhost:9091/eureka
Parece que ele não está sendo executado, mesmo com o log "pre lambda log" sendo impresso, qualquer coisa que é feita dentro da expressão não reflete na aplicação. Qualquer log que é lançado, exceptions e até alterações no request do client não resultam em nada, os logs não são impressos, as exceptions não quebram nenhum fluxo e as alterações no request do cliente não acontecem.
- O gateway é acessado em
localhost:9092
, um dos vários serviços pode ser acessado emlocalhost:9094/auth/test
. Para acessar esse endpoint através do gateway serialocalhost:9092/auth-ms/auth/test
Para fins de teste implementei um GlobalFilter e injetei. Funcionou como esperado, mas não é adequado para a aplicação.
O básico do projeto, apenas com o EurekaServer, Gateway e um dos serviços estão em https://github.com/mateuspontess/ms-app.git
Não consegui descobrir aonde estou errando...