当前位置: 首页 > 知识库问答 >
问题:

更改Spring Security WebFilter的顺序

吕胤
2023-03-14

-路径:/APP2/**

这意味着与其使用身份验证->路由映射->过滤web处理程序,不如使用路由映射->身份验证->过滤web处理程序。这三个组件并不是不相似,它们中的一个是过滤器,另一个是映射器,最后一个是web处理程序。现在我知道如何自定义它们,但问题是我不知道如何拦截Netty服务器构建过程,以便更改这些操作的顺序。我需要等待构建过程结束,并在开始之前更改服务器的内容。我怎么能那么做?

共有1个答案

濮阳
2023-03-14

编辑:这是最终的解决方案:我是这样做的:

目标:从默认的HttpHandler中删除Spring Security的WebFilter,并将其插入到RoutePredicateOutemapping和Spring Cloud Gateway的FilteringWebHandler之间

原因:因为在进行自定义身份验证过程时,我需要知道应用程序ID。RoutePredicateRouteMapping通过将请求的URL与预定义列表匹配,将此应用程序ID附加到请求。

@Bean
public HttpHandler httpHandler() {
    WebHttpHandlerBuilder html" target="_blank">webHttpHandlerBuilder = WebHttpHandlerBuilder.applicationContext(this.applicationContext);

    MyAuthenticationHandlerAdapter myAuthenticationHandlerAdapter = this.applicationContext.getBean(MY_AUTHENTICATED_HANDLER_BEAN_NAME, MyAuthenticationHandlerAdapter.class);

    webHttpHandlerBuilder
            .filters(filters ->
                    myAuthenticationHandlerAdapter.setSecurityFilter(
                            Collections.singletonList(filters.stream().filter(f -> f instanceof WebFilterChainProxy).map(f -> (WebFilterChainProxy) f).findFirst().orElse(null))
                    )
            );

    return webHttpHandlerBuilder.filters(filters -> filters
            .removeIf(f -> f instanceof WebFilterChainProxy || f instanceof WeightCalculatorWebFilter || f instanceof OrderedHiddenHttpMethodFilter))
            .build();
}
@Bean
public MyAuthenticationHandlerAdapter myAuthenticationHandlerAdapter() {
    return new MyAuthenticationHandlerAdapter();
}

public class MyAuthenticationHandlerAdapter implements HandlerAdapter {
    @Setter
    private List<WebFilter> securityFilter = new ArrayList<>();


    @Override
    public boolean supports(Object handler) {
        return handler instanceof FilteringWebHandler;
    }

    @Override
    public Mono<HandlerResult> handle(ServerWebExchange exchange, Object handler) {
        org.springframework.web.server.handler.FilteringWebHandler filteringWebHandler = new org.springframework.web.server.handler.FilteringWebHandler((WebHandler) handler, securityFilter);
        Mono<Void> mono = filteringWebHandler.handle(exchange);
        return mono.then(Mono.empty());
    }
}

Spring Security for WebFlux被实现为WebFilter,它几乎在收到请求后立即执行。我已经实现了自定义身份验证转换器和身份验证管理器,它们将从头部和URL中提取一些变量,并使用它们进行身份验证。这是工作没有任何问题。

ChannelOperations调用ReactorHttpHandlerAdapter,后者调用HttpWebHandlerAdapter、ExceptionHandlingWebHandler,然后调用org.springframework.web.server.handler.FilterWebHandler。

这个WebHandler将调用它的过滤器,然后调用DispatchHandler。其中一个过滤器是WebFilterChainProxy,它为Spring Security进行身份验证。所以第一步是从这里移除过滤器。

现在,在过滤器之后调用的DispatchHandler将调用RoutePredicateHandlerMapping,它将分析路由并给出我需要的路由ID,然后调用org.springframework.Cloud.gateway.handler.FilteringHandler(这与上面的FilteringHandler不同),然后调用Spring Cloud Gateway的其他过滤器。这里我想要的是在RoutePredicatehandlerMapping之后和org.springframework.cloud.gateway.handler.FilteringHandler之前调用过滤器。我最后做的事情是:

 类似资料:
  • orderList中的订单更改对list变量没有影响。我试过primefaces orderlist没有更新更改的顺序,primefaces:如何保存p:orderlist中重新排序的数据?并检查了其他多个问题,但没有一个对我有效。我在提交命令按钮中添加了流程和更新订单列表,在命令按钮中添加了ajax处理,直接添加到订单列表,但仍然没有任何内容。

  • 问题内容: 我有一个包含JSON对象的文件。已通过以下方式加载: 此时,input_data仅包含一个字符串,现在我将其解析为JSON: data_content具有我需要的字符串的JSON表示形式,但是由于某种原因,在json.loads之后我不清楚,它改变了键的原始顺序,例如,如果我的文件包含以下内容: 在json.loads之后,顺序更改为类似以下内容: 为什么会这样呢?有办法保留订单吗?我

  • 我有以下(): 我按分配添加更多列: 如何将列移到前面,即将其设置为第一列,其他列的顺序保持不变?

  • 问题内容: 在我的Jenkins仪表板上,我有四个工作。 是否可以更改这些作业的显示顺序? 谢谢 问题答案: Jenkins默认情况下按升序对作业进行排序。1,2,3,A,b,c等。但是,您可以使用此仪表板插件来提供更接近您所需要的内容 https://wiki.jenkins- ci.org/display/JENKINS/Dashboard+View 此外,还有一个插件可以根据优先级对队列中的

  • 问题内容: 我有以下: 我通过分配添加了更多列: 如何将列mean移到最前面,即将其设置为第一列,而其他列的顺序保持不变? 问题答案: 你还可以执行以下操作: 你可以通过以下方式获取列列表: 输出将产生: …然后轻松将其放到第一个功能中即可手动重新排列

  • 我正在寻找一种方法来更改Java堆栈中元素的顺序,以便偶数在奇数下。 例如:5, 2, 6, 7, 1, 4, 3 它变成这个5, 7, 1, 3, 2, 6, 4。 以下是我目前的代码,我被困在寻找如何改变订单: 谢谢你的帮助!