Вставьте настраиваемый фильтр в цепочку фильтров безопасности Spring в Spring Cloud Gateway - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над облачным шлюзом Spring, который аутентифицируется с помощью OAuth2 с помощью цепочки фильтров безопасности Spring. В настоящее время у меня возникает ошибка на странице входа в OAuth2 из-за того, что какой-то неизвестный запрос авторизации не найден, и мне нужно решить эту проблему. Я нашел выход, добавив настраиваемый заголовок местоположения и направив пользователя в это место при возникновении исключения. В настоящее время я сталкиваюсь с проблемами, когда имею контроль над цепочкой пружинных фильтров безопасности. Ниже приведен блок кода, который я использовал:

 @Bean
 @Order(1)
 SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity serverHttpSecurity)
  throws Exception {
        ServerRequestCache requestCache = NoOpServerRequestCache.getInstance();
        WebFilter webFilter = new CustomWebFilter();
        serverHttpSecurity
          //.addFilterAt(webFilter, SecurityWebFiltersOrder.FIRST)
          .cors().and().headers()
          .frameOptions().disable()
          .and().requestCache().requestCache(requestCache)
          .and().csrf().disable()
          .authorizeExchange().pathMatchers("/**").authenticated()
          .and().oauth2Login()
          .and().oauth2Client()
          .and().oauth2ResourceServer().jwt();
     return serverHttpSecurity.build();
   }

Здесь я попытался добавить фильтр перед аутентификацией, но он блокирует запрос, и я получаю нулевой ответ, и он не направляет меня в страница входа.

.addFilterAt(webFilter, SecurityWebFiltersOrder.FIRST)

Ниже мой customWebFilter, где я добавил код для добавления заголовка местоположения.

public class CustomWebFilter implements WebFilter {

    @Autowired
    URIconfig uRIconfig;
    final Logger logger = LoggerFactory.getLogger(CustomWebFilter.class);

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
      URI location = exchange.getRequest().getURI();
      uRIconfig.setLocation(location);
      logger.info("Custom Pre Filter executed");
       return chain.filter(exchange);
    }
 }

Может кто-нибудь помочь мне добавить заголовок или повар ie в зависимости от того, что возможно до того, как запрос будет перенаправлен на страницу входа OAuth2? Или как я могу использовать фильтр?

Любая помощь приветствуется. Заранее спасибо!

1 Ответ

0 голосов
/ 20 июля 2020

Я решил эту проблему, изменив порядок цепочки пружинных фильтров безопасности на 5 и добавил @Order (Ordered.HIGHEST_PRECEDENCE) в свой собственный фильтр. Теперь мой фильтр вызывается перед моей страницей входа в keycloak, и я могу добавить свою собственную реализацию. Ниже приведены внесенные мной изменения:

Application.yml

spring:
  security:
    filter:
      order: 5

CustomWebFilter. java

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@Slf4j
public class CustomWebFilter implements WebFilter {

  @Override
  public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    log.info("My Custom Web Filter.");
    return chain.filter(exchange);
  }
}
...