使用OAuth2身份验证启用Spring Boot Health Actuator

时间:2017-05-24 16:45:45

标签: spring-boot spring-security jwt spring-security-oauth2 spring-boot-actuator

我们已经看到了许多与Spring Boot的Health Actuator端点相关的问题。经历了其中的一些,我们仍然处于亏损状态。

我们的目标是:

  1. 利用Spring Boot / Spring Security自动配置安全过滤器链(即不必完全实现/配置HttpSecurity
  2. 启用安全健康访问权限(查看应用程序运行状况信息的完整视图)
  3. 启用不安全健康访问(以允许端点在Kubernetes中充当活动探测)
  4. 我们尝试过:

    1. 使用WebSecurityConfigurerAdapter并配置WebSecurity对象以忽略/health端点的安全性,然后根据{{3将单独的端点映射到/health端点希望能够启用安全路径。
    2. 确保Routing multiple URLs to Spring Boot Actuator's health endpoint中推荐的security.oauth2.resource.filter-order=3。这会将OAuth2AuthenticationProcessingFilter放在Actuator的Mvc端点之前,并允许处理包含预先认证的Authorization: Bearer ...标头(例如JWT授权)的请求。但是,它规定所有请求都包含授权 - 否则,FilterSecurityInterceptor触发器Secure object: FilterInvocation: URL: /health; Attributes: [#oauth2.throwOnError(authenticated)]AccessDeniedException
    3. /health和OAuth2使用基本身份验证,其他所有内容都是免费的(请参阅https://github.com/spring-projects/spring-boot/issues/5072& Spring boot oauth2 management httpbasic authentication)。

      我们一直在回答的问题是我们如何得到:

      • 匿名请求/health端点充当不安全
      • 预先通过身份验证的请求(即包含预先通过身份验证的Authorization: Bearer ...标头的请求)到/health端点没有相应的授权或角色才能充当不安全
      • 预先通过身份验证的请求(即包含预先通过身份验证的Authorization: Bearer ...标头的请求)到/health端点具有相应的授权或角色,以充当安全

      我们可以通过以下方式轻松允许任何请求访问/health

      @Configuration
      @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
      public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        public void configure(WebSecurity web) throws Exception {
          super.configure(web);
          web.ignoring().antMatchers(HttpMethod.GET, "/health", "/info");
        }
      }
      

      这完全可以作为准备/活力探测器。但是,当用户实际进行身份验证时,它不会提供查看哪些支持服务可能行为不正常的好处。

      提前致谢!

2 个答案:

答案 0 :(得分:0)

我遇到了类似的东西,这有点起作用: 为执行器添加一个hacky访问规则,例如:#oauth2.clientHasRole(' ROLE_CLIENT')或hasRole(' ROLE_ANONYMOUS'),可以为执行器端点填充安全上下文(两者都是经过身份验证和未经过身份验证的请求)并调整“敏感”信息。执行器端点配置。 / health应返回匿名和完整信息的基本信息,以便在此情况下进行身份验证,前提是您启用了管理安全性并将其标记为非敏感。 您仍然需要保留过滤器配置。

答案 1 :(得分:0)

尝试一下,为我工作

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/**").authorizeRequests()
            .antMatchers("/actuator/**","/assets/**")
            .permitAll()
            ........
    ;

}