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

禁用执行器运行状况终结点的webflux(reactive)安全性

舒俊雄
2023-03-14

我有一个WebFlux、Health Actuctor和Spring Security的项目。我正在尝试构建自定义身份验证,但该身份验证也会在健康执行器endpoint上发挥作用。我怎样才能禁用它?

根据文档,我实现了一个自定义的ServerSecurityContextrepository,下面是它的基本版本:

@Component
class MySecurityContextRepository: ServerSecurityContextRepository {
    override fun save(exchange: ServerWebExchange?, context: SecurityContext?) = Mono.empty()

    override fun load(exchange: ServerWebExchange) = Mono.error(ResponseStatusException(HttpStatus.UNAUTHORIZED, "Access denied"))
}

根据文档,不应该要求我进行任何额外的配置来禁用健康endpoint上的身份验证。以下是application.yml中的配置:

management:
  metrics:
        web:
          server:
            auto-time-requests: true
            requests-metric-name: xxx-xxx-xxx
        export:
          statsd:
            enabled: xxxx
            host: xxxxxxxxxxxx
            flavor: xxx
  endpoint:
      health:
        enabled: true
  endpoints:
      web:
          base-path: /application
@EnableWebFluxSecurity
class SecurityConfig @Autowired constructor(
        private val myRepository: MySecurityContextRepository
) {
    @Bean
    fun securityWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        http.securityContextRepository(myRepository)
        http.authorizeExchange()
                .pathMatchers("/application/health").permitAll()
                .anyExchange().permitAll()

        http.cors().disable()
        http.csrf().disable()
        http.formLogin().disable()

        return http.build()
    }
}

尽管添加了此功能,但curl http://localhost:8080/application/health/仍会导致{“name”:“xxxxxx”,“message”:“unknown error”,“response”:“401 UNAUTHORIZED\”“}状态代码也是401。如何禁用我的健康终结点的授权?

共有1个答案

宁卓
2023-03-14

因此,在没有任何帮助之后,我开始查看源代码,结果发现ServerSecurityContextrepository总是为HealthEndpointInfoEndpoint调用,所以我自己添加了跳过repository中身份验证检查的逻辑。您可以轻松地执行以下操作:

val HEALTH_ENDPOINTS = EndpointRequest.to(HealthEndpoint::class.java, InfoEndpoint::class.java)

现在可以执行以下操作:

            return HEALTH_ENDPOINTS.matches(exchange).flatMap { matches ->
                if (matches.isMatch) {
                    Mono.just(SecurityContextImpl(GuestAuthToken))
                } else {
                    Mono.empty()
                }
            }

这样,我就不会硬编码存储库中的任何路径。虽然不是很理想,但可以完成任务。

 类似资料:
  • 在我的项目中,我不想使用。我的application.java有、和注释。 我在pom.xml中添加了Spring Boot执行器依赖项。但是,当我尝试访问时,得到的是404。我相信我需要指定一些配置类作为导入注释的一部分。我需要帮助弄清楚配置是什么。

  • 我已经用spring Security保护了我的spring boot应用程序(基本身份验证)。我为可以使用监视和管理的用户添加了角色管理。我设置management.security.roles=management。具有此角色的用户只能看到状态(使用运行状况终结点)。如果我设置management.security.role=management,则一切正常(具有此角色的用户可查看所有健康参数

  • 我正在使用Spring Boot安全性和Oauth2。我不想禁用健康endpoint的安全性。 我可以完全禁用安全性,或者编写自己的实现并禁用autoconfigured One。 但是如何修改()的现有实现? 我试图创建自己的配置而不禁用AutoConfigurated一个,但由于冲突,这是不可能的。 以下是错误消息: 此外,我试图显式地为我自己的安全配置设置更高的顺序,但看起来自动配置的一个覆

  • 我最近将SpringBoot项目从1.1升级到1.4,突然,“/health”endpoint的测试开始失败 发生的事情是:第一个测试总是通过,而第二个测试总是失败。输出为200。如果顺序颠倒,也会发生同样的情况,所以 这一次,503失败了。如果我添加线程。在像这样的实际Rest电话之前先睡一觉 那它每次都会过去!因此,Spring似乎在中引入了一些更改,并且需要一些时间来配置一个模拟(可能现在在

  • 我试图为部署到k8s的应用程序设置就绪探测,但在执行器/健康endpoint下,与执行器/健康/就绪endpoint相比,我得到了不同的状态。 重要的是,只有当应用程序部署到k8s集群时,才会观察到这种行为。 因此,在应用程序中没有任何额外的配置。属性我正在获取的文件: 这似乎是正确的——如果准备状态是,健康endpoint也会返回,因为它包括组。这至少是一致的。 另一方面,当我在应用程序中指定准