[spring-projects/spring-boot]支持为执行器基本路径添加 EndpointRequest 请求匹配器

2024-04-23 658 views
6

我们正在添加多个 Spring Security 配置,并且希望执行器在其自己的配置中受到保护。我们正在做以下事情:

http
 .requestMatcher(EndpointRequest.toAnyEndpoint())
 .authorizeRequests()
 .requestMatchers(EndpointRequest.to(InfoEndpoint.class, HealthEndpoint.class)).authenticated()
 .requestMatchers(EndpointRequest.toAnyEndpoint()).hasAnyAuthority(DefaultPrivileges.ACCESS_ADMIN)
  .and().httpBasic();

如果我使用了EndpointRequest.toLinks(),那么只有/actuator匹配而不是匹配/actuator/**

回答

0

EndpointRequest.toAnyEndpoint()包括所有执行器,包括链接(除非您明确排除链接)。您能否再解释一下为什么.requestMatcher(EndpointRequest.toAnyEndpoint())不执行您想要的操作来将此配置仅限于执行器端点?

9

确实如此,但此时创建了 N 个OrRequestMatcher(每个端点一个)而不是仅一个 ( /actuator/**)。这意味着在每个请求中,每个端点都需要遍历每个端点,以确定是否应该调用此安全过滤器链。看这里

如果可能的话,我想避免选择单身RequestMatcher

据我了解(根据我今天的调试)。将为每个创建WebSecurityConfigurerAdapter一个。FilterSecurityChain

3

@filiphr/actuator前缀是可配置的,如果需要 Boot 1.5 样式路径,则可以选择删除前缀。我认为不可能总是概括为/actuator/**一种模式。

9

如果您知道自己的代码始终使用/actuator作为前缀,则可以使用 anAntPathRequestMatcher而不是EndpointRequest.toAnyEndpoint().我认为我们不应该在……方面表现得太聪明EndpointRequest.toAnyEndpoint()。使用多个RequestMatchers对我来说似乎很好。

7

我知道,/actuator前缀只是一个例子。当前的EndpointRequest基础设施使用WebEndpointProperties来获取配置的模式。像这儿

我想到的是这样的:

requestMatcherFactory.antPath(properties.getBasePath() + "/**")

我创建了一个RequestMatcher类似于 Boot 的自定义LinksRequestMatcher,唯一的区别是添加/**到基本路径

6

我懂了。我会重新开放,以便我们考虑一下。我有点担心增加该 API 的表面积。

3

谢谢。

理论上您不必添加新方法。您只需调整委托创建即可在和为空pathMappedEndpoints.getBasePath() + "/**"时创建,并且包含基本路径和链接。这意味着当一个人使用时,默认情况下将被使用(这就是我使用它时预期会发生的情况)。includesexcludesEndpointRequest.toAnyEndpoint()/{base-path}/**

这只是我此时此刻的想法

4

toAnyEndpoint我不喜欢根据是否设置而表现不同的想法basePath

4

嗯,它已经为链接做到了这一点。

if (this.includeLinks && StringUtils.hasText(pathMappedEndpoints.getBasePath())) {
    delegateMatchers.add(requestMatcherFactory.antPath(pathMappedEndpoints.getBasePath()));
}
6

我的想法是,如果没有设置基本路径,那么它将执行与现在相同的操作

8

嗯,它已经为链接做到了这一点。

它与链接的任何后缀都不匹配,没有/**后缀。

您想要后缀的主要原因是什么/**?我仍然不确定我是否完全理解您正在使用的哪些其他路径未涵盖toAnyEndpoint()

3

我指的是:

toAnyEndpoint我不喜欢根据是否设置而表现不同的想法basePath

此问题的区别和原因是/**通过当前方法toAnyEndpoint或新方法作为辅助方法添加后缀。

原因是当存在多个安全配置时,一个用于执行器,然后是其他一些,然后 Spring Security 创建了多个SecurityFilterChain。然后检查FilterChainProxy每个请求SecurityFilterChain是否匹配。这意味着如果执行器是第一个,那么对于每个请求,将检查所有端点请求匹配器是否匹配,并toAnyEndpoint()创建OrRequestMatcher与所有端点的匹配器。

问题不在路径中,带有后缀或toAnyEndpoint()它的工作原理相同。唯一的区别是RequestMatcher每个请求评估的数量。

3

原因是当有多个安全配置时,一个用于执行器,然后是其他一些,然后 Spring Security 创建了多个 SecurityFilterChains

这实际上给你带来了问题吗?您是否发现存在性能问题?或者这会让调试变得更加困难?我们不应该创建多个匹配器的根本原因是什么?

0

我明天将检查性能问题,以确保可以在此处显示一些数字。

至于调试,是的,由于日志中有更多匹配器,这使得调试变得更加困难。不过,我可以忍受。

4

我创建了一个演示项目,可以在其中选择使用基本路径AntMatcherEndpointRequest#toAnyEndpoint().

我做了一些运行,调用了问候控制器 100000 次迭代,我得到了

  • 使用基本路径匹配器时为 4175 (3963) req/s
  • EndpointReques#toAnyEndpoint()使用时为 3691 (3157) req/s

这些数字是通过调用执行器指标端点来计算的。

请随意尝试该项目。这两个数字当然都不错,在现实世界中它们可能会推迟,但我只是想表明它可能会产生影响。

6

我不相信有足够的性能提升来真正保证这种改变,特别是当你可以轻松插入你自己的蚂蚁匹配器时。我也更喜欢始终做同一件事的一致性toAnyEndpoint,无论basePath.