He configurado Spring Security para autenticar y autorizar las solicitudes que llegan a mi aplicación. He configurado la configuración de la siguiente manera:

 public class OAuth2ServerConfiguration extends ResourceServerConfigurerAdapter {

        @Override
        public void configure(ResourceServerSecurityConfigurer resources) {

            // ...set up token store here

            resources.authenticationEntryPoint(new AuthenticationEntryPoint() {
                @Override
                public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {

                 //QUESTION
                 // How do I get the destination controller that this request was going to go to?
                 // Really, I'd like to get some information about the annotations that were on the destination controller.

                    response.setStatus(401);
                }
            });
        }

Me gustaría obtener información sobre el controlador de destino al que se dirigirá esta solicitud. El controlador en realidad no va a ser golpeado en este escenario porque la seguridad de primavera se activó y arrojó la respuesta antes de que llegara al controlador.

¿Algun consejo? ¡Gracias!

2
Jeff 15 dic. 2016 a las 21:34

2 respuestas

La mejor respuesta

Suponiendo que OAuth2ServerConfiguration es un bean administrado por Spring, esto debería funcionar para usted.

...

@Autowired
private List<HandlerMapping> handlerMappings;

for (HandlerMapping handlerMapping : handlerMappings) {
  HandlerExecutionChain handlerExecutionChain = handlerMapping.getHandler(request);
  if (handlerExecutionChain != null) {
     // handlerExecutionChain.getHandler() is your handler for this request
  }
}

Si no puede conectar automáticamente una lista de HandlerMapping, conecte automáticamente ApplicationContext y ajuste de la siguiente manera.

for (HandlerMapping handlerMapping : applicationContext.getBeansOfType(HandlerMapping.class).values()) {
  HandlerExecutionChain handlerExecutionChain = handlerMapping.getHandler(request);
  if (handlerExecutionChain != null) {
     // handlerExecutionChain.getHandler() is your handler for this request
  }
}
4
lane.maxwell 15 dic. 2016 a las 19:57

Podrías probar esto:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                return true;
            }

            @Override
            public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

            }

            @Override
            public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                // handler is the controller
                MyAnnotation annotation = ((HandlerMethod) handler).getMethod().getAnnotation(MyAnnotation.class)
                // do stuff with the annotation
            }
        });
    }
}
1
Derek Fredrickson 16 dic. 2016 a las 14:04