2016-02-02 1 views
0

Я пытаюсь применить перехватчик Grails 3.0.12 с совпадением uri к конечным точкам управления, предоставленным Spring Boot Actuator. У меня есть привод management.context_path свойство установлено на /admin.Как применять перехватчики Grails 3 к конечным точкам исполнительного элемента Spring Boot

Все конечные точки, отображаемые в 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 

Как обеспечить, чтобы конечные точки, обеспечиваемые приводом, были перехвачены?

ответ

0

Я нашел один из способов сделать это, реализовав метод 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 загрузки привода и не будет работать, скажем, Spring Cloud Config конечных точек. Я хотел бы видеть более обобщенный способ перехвата всех URI-сопоставлений с перехватчиком Grails.

Смежные вопросы