java spring-security osgi cxf apache-karaf

java - Uso de Spring Security en un paquete JAX-RS en Karaf



spring-security osgi (1)

En primer lugar, necesita una comprensión clara de lo que hacen spring y web.xml.

  • Web.xml es el archivo estándar para configurar su contenedor de servlets, que generalmente es un servidor de aplicaciones como Jboss, Glassifsh, Jetty, Tomcat ...
  • Su beans.xml es un archivo de configuración para el contexto de la aplicación Spring, dado que no está usando ningún espacio de nombres para él, significa que Karaf usa Spring Oob.

Si desea hacer HTTP usando servlets, sin un contenedor, supongo que tendría que registrar un HttpService, consulte: http://karaf.apache.org/manual/latest-2.2.x/users-guide/http.html

Su excepción sucede, porque cuando llega al método asignado, no hay ningún bean de autenticación en el SecurityContext. No ha definido ningún acceso anónimo en sus asignaciones, tal vez por eso falla.

Básicamente, defina un AnonymousAuthenticationFilter o un patrón de URL con permitAll en su configuración http. De lo contrario, seguirá recibiendo esa excepción, la primera vez que intente conectarse de manera anónima con la misma sesión.

Tengo un paquete OSGi que utiliza JAX-RS para manejar algunos servicios REST. Este paquete se está ejecutando en Karaf con Apache CXF. Necesito aplicar autenticación HTTP básica a ciertas combinaciones de ruta / método. He estado jugando con Spring Security y parece que la nueva versión 3.1 te permite hacer exactamente esto, sin embargo, he tenido muchos problemas para que funcione en OSGi.

Solo como prueba, he creado un archivo beans.xml muy simple:

<beans> <import resource="classpath:META-INF/cxf/cxf.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml"/> <import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/> <import resource="classpath:META-INF/cxf/osgi/cxf-extension-osgi.xml"/> <jaxrs:server id="serverTest" address="/test"> <jaxrs:serviceBeans> <ref bean="tstSvr"/> </jaxrs:serviceBeans> </jaxrs:server> <bean id="tstSvr" class="com.demo.Test"/> <security:http auto-config="true"> <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN" method="PUT" /> <security:intercept-url pattern="/**" access="ROLE_USER" /> </security:http> <security:authentication-manager> <security:authentication-provider> <security:user-service> <security:user name="user" password="pass" authorities="ROLE_USER"/> <security:user name="admin" password="pass" authorities="ROLE_ADMIN"/> </security:user-service> </security:authentication-provider> </security:authentication-manager> </beans>

Ahora, aquí viene la parte divertida ... De toda la lectura que he estado haciendo, necesito un web.xml para que funcione todo esto. Como esta muestra que traté de usar:

<web-app> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

Usar la combinación de esos dos archivos no funcionó. Y por "no funcionó", quiero decir que no pasó nada. Sin mensajes de error, sin excepciones, el paquete funcionó como antes de que intentara agregar seguridad Spring. Supongo que el problema es que el paquete debe ser un WAR o WAB para que se cargue el web.xml. ¿Es esto correcto?

Y, lo que es más importante, ¿hay alguna forma de que Spring funcione sin un web.xml?

Estoy trabajando en el supuesto de que necesito mantener el paquete como un paquete para que CXF lo cargue, así que no puedo convertirlo en WAR o WAB, pero no estoy totalmente seguro de que ese sea el caso.

¡Gracias por cualquier ayuda que usted nos pueda proporcionar!

ACTUALIZACIÓN: Después de hacer un montón de googlear adicionales, encontré una publicación en el foro que mencionaba agregar Web-FilterMappings: springSecurityFilterChain;url-patterns:="/*" a tu manifiesto en lugar de usar un web.xml. Sin embargo, aún parece que necesitas usar un WAB en lugar de un paquete normal. He agregado la línea a mi manifiesto en el caso, pero no tiene ningún efecto. Parece que mi pregunta se está convirtiendo en: ¿Cómo uso un WAB con CXF?

ACTUALIZACIÓN 2: debido a que esta pregunta no es lo suficientemente larga ... decidí intentar usar las anotaciones de Spring Security en lugar de intercept-url solo para ver qué pasaría. Cuando trato de encontrar un camino seguro, obtengo este divertido rastro de pila:

Caused by: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:323) at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:196) at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:59) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)[46:org.springframework.aop:3.0.5.RELEASE]

El sitio web de Spring dice que esto sucede la primera vez que intenta conectarse anónimamente a un servicio seguro y no volverá a suceder por segunda vez. Bueno, me pasa cada vez. De la excepción, parece que mi entrada en el manifiesto está siendo recogida y tal vez el problema es diferente de lo que pensaba. ¿Alguien tiene alguna idea sobre por qué esto está sucediendo? ¿Me falta alguna entrada en el archivo beans.xml para que funcione la autenticación http básica?