2012-05-30 16 views
5

Tengo una aplicación de Jersey configurada con la autenticación de manejo de Spring Security. El paquete jersey-spring proporciona la clase SpringServlet que está registrada en mi web.xml como servlet.Jersey y filtro Excepción de manipulación

Autenticación y todo funciona según lo esperado. Lo que me pregunto es cómo enviar AuthenticationExceptions (y otras excepciones de filtro) a través del servlet Jersey, para que pueda usar nuestro ExceptionMapper para procesarlos.

Originalmente, el SpringServlet se configuró como un filtro, pero después de leerlo comprendí que un servlet debería ser capaz de manejar las excepciones lanzadas en los filtros (quizás sea una interpretación incorrecta). No noto ningún cambio en el comportamiento después de cambiarlo a un servlet, y si rastreo a través del código Spring Security puedo ver dónde se está escribiendo HttpServletResponse.

Mi pregunta: ¿Es posible que el filtro Spring Security haga excepciones al proceso de servlet de Jersey?

+0

Hola Nick, ¿es posible que publiques un SSCCE demostrando tu propia configuración? –

+0

Sí, agregaré una pequeña muestra tan pronto como tenga la oportunidad. –

Respuesta

0

Cómo lo hace depende de si está invocando Jersey de Spring Security o Spring Security de Jersey.

Si está invocando Spring Security desde el contenedor de Jersey, no debería tener que hacer nada más que definir un asignador de excepciones para la excepción correspondiente.

Si está invocando Jersey solo una vez que el cliente pasa los filtros de Spring Security, Jersey no atrapará ninguna excepción mientras la solicitud del cliente pase por esos filtros (porque la solicitud aún no ha ingresado en el contenedor Jersey) . Una forma de "obtener" la excepción en el recipiente Jersey es:

  1. pesca del AuthenticationException en un filtro de autenticación personalizado e invocar el AuthenticationFailureHandler.onAuthenticationFailure() método (que pasa en la excepción), y asegúrese de romper la cadena de filtros por no invocando FilterChain.doFilter()
  2. configurar su AuthenticationFailureHandler llamar a un recurso Jersey de su diseño que va a recuperar (y luego re-lanzamiento) las excepciones generadas por primavera con HttpServletRequest.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)

Puede haber otras formas de "obtener" la excepción en Jersey-land, pero esta es una de las formas que me funcionó en el pasado.

+0

Gracias por la respuesta a esta pregunta muy antigua; el problema persiste, pero voy a intentarlo una vez que pueda. ¡No he trabajado en el proyecto desde hace un tiempo! –

+0

Vaya, no me di cuenta de que el problema era tan viejo ... – maxenglander

Cuestiones relacionadas