我有一个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
。如何禁用我的健康终结点的授权?
因此,在没有任何帮助之后,我开始查看源代码,结果发现ServerSecurityContextrepository
总是为HealthEndpoint
和InfoEndpoint
调用,所以我自己添加了跳过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也会返回,因为它包括组。这至少是一致的。 另一方面,当我在应用程序中指定准