grails - 如何将Grails 3拦截器应用于Spring Boot Actuator端点

标签 grails spring-boot spring-boot-actuator

我正在尝试将具有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

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

最佳答案

我确实找到了一种方法,可以通过实现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端点。我想看到一种更通用的方式,可以使用Grails拦截器拦截所有URI映射。

关于grails - 如何将Grails 3拦截器应用于Spring Boot Actuator端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35144544/

相关文章:

java - 带有 spring-restdocs 2.0.2.RELEASE 的空指针(带有 Restassured)

spring-boot - 如何在新的grails 3应用程序中使用现有的web.xml?

java - 如何通过动态创建spring bean的行为使@ConditionalOnMissingBean工作(例如: beanfactory register)

spring-boot - Spring Boot Actuator/health 端点响应缓慢?

java - Spring 致动器上的不同端口

grails - 名称为 “${appname}.log”的外部log4j的Grails无效

grails - 多对多和映射问题

java - Spring WAR 不创建 BuildProperties Bean

web-services - Grails-调用Web服务时未找到类定义错误

validation - 如何记录 Grails 命令对象错误?