【问题标题】:How to apply Grails 3 interceptors to Spring Boot Actuator endpoints如何将 Grails 3 拦截器应用于 Spring Boot Actuator 端点
【发布时间】:2016-05-10 17:33:02
【问题描述】:

我正在尝试将带有 uri 匹配器的 Grails 3.0.12 拦截器应用于 Spring Boot Actuator 提供的管理端点。我将执行器 management.context_path 属性设置为 /admin

UrlMappings.groovy 中映射的所有端点都被拦截,但managed by Spring Boot Actuator 没有。相反,我在日志中看到以下内容表明拦截器被绕过:

DEBUG: org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping - Looking up handler method for path /admin/metrics
DEBUG: org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping - Returning handler method [public java.lang.Object org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter.invoke()]

这是我的拦截器:

class LoginInterceptor {

    def securityService

    int order = HIGHEST_PRECEDENCE

    LoginInterceptor() {
        match(uri: "/**")
    }

    boolean before() {
        if (!request.exception) {
            securityService.authenticateUser()
        }
        true
    }

    boolean after() { true }

    void afterView() { /* no-op */ }
}

这是 application.yml 中的管理配置

management:
  context_path: /admin

如何确保执行器提供的端点被拦截?

【问题讨论】:

    标签: grails spring-boot spring-boot-actuator


    【解决方案1】:

    我确实找到了一种方法,方法是实现 EndpointHandlerMappingCustomizer customize() 方法,其中 GrailsInterceptorHandlerInterceptorAdapter 被设置为拦截器。

    import org.grails.plugins.web.interceptors.GrailsInterceptorHandlerInterceptorAdapter
    import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping
    import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMappingCustomizer
    
    class ActuatorInterceptor implements EndpointHandlerMappingCustomizer {
        GrailsInterceptorHandlerInterceptorAdapter interceptorAdapter
    
        @Override
        public void customize(EndpointHandlerMapping mapping) {
            Object[] interceptors = [ interceptorAdapter ]
            mapping.setInterceptors(interceptors)
        }
    }
    

    resources.groovy:

    beans = {
        actuatorInterceptor(ActuatorInterceptor) {
            interceptorAdapter = ref('grailsInterceptorHandlerInterceptorAdapter')
        }
    }
    

    这不太理想,因为它特定于 Spring Boot Actuator,并且不适用于 Spring Cloud Config 端点。我希望看到一种更通用的方法来拦截所有 URI 映射使用 Grails 拦截器

    【讨论】:

      猜你喜欢
      • 2015-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2021-08-25
      • 2016-06-01
      • 2015-02-22
      • 1970-01-01
      相关资源
      最近更新 更多