首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring Cloud Gateway的Spring安全过滤器链中插入自定义过滤器

在Spring Cloud Gateway的Spring安全过滤器链中插入自定义过滤器
EN

Stack Overflow用户
提问于 2020-07-15 03:41:46
回答 1查看 1.7K关注 0票数 1

我正在开发spring cloud gateway,它在spring安全过滤链的帮助下通过OAuth2进行身份验证。目前,我在OAuth2的登录页面上有一个错误,因为一些未知的授权请求没有找到错误,我需要解决。我已经找到了一种解决方法,即添加一个自定义位置标头,并在发生异常时将用户路由到该位置。目前,我正面临着在spring安全过滤器链之前进行控制的挑战。下面是我使用的代码块:

代码语言:javascript
复制
 @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();
   }

在这里,我尝试在身份验证之前添加过滤器,但它阻止了请求,我得到了一个空响应,并且它不会将我路由到登录页面。

代码语言:javascript
复制
.addFilterAt(webFilter, SecurityWebFiltersOrder.FIRST)

下面是我的customWebFilter,我在其中添加了添加位置heade的代码。

代码语言:javascript
复制
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);
    }
 }

在请求重定向到OAuth2登录页面之前,有人能帮我添加标题或cookie吗?或者,我如何使用过滤器?

任何帮助都是非常感谢的。提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-20 18:00:57

我解决了这个问题,将spring安全过滤器链的顺序改为5,并在我的自定义过滤器中添加了一个@ order (Ordered.HIGHEST_PRECEDENCE)。现在,我的过滤器在keycloak登录页面之前调用,我可以添加我的自定义实现。以下是我所做的更改:

Application.yml

代码语言:javascript
复制
spring:
  security:
    filter:
      order: 5

CustomWebFilter.java

代码语言:javascript
复制
@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);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62902855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档