2012-05-04 13 views
6

He creado un servicio web Axis como una aplicación Java 6 ejecutándose en Tomcat 7. Para la seguridad, el marco Spring Security 2.0.1 está integrado.Seguridad de primavera: excluyendo el documento WSDL de requerir autenticación

Por razones de seguridad, el punto final del servicio debe estar protegido con autenticación básica. Sin embargo, el documento WSDL debe estar a disposición del público.

He creado una configuración de seguridad de Primavera de esta manera:


<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> 

    <http> 
     <intercept-url pattern="/services/InitechAuthenticationService*" access="ROLE_WSUSER" /> 
     <intercept-url pattern="/services/InitechAuthenticationService?wsdl" filters="none" /> 
     <http-basic /> 
    </http> 

    <authentication-provider> 
     <user-service> 
      <user name="internal" password="${WS_USER_INTERNAL_PASSWORD}" authorities="ROLE_WSUSER" /> 
      <user name="external" password="${WS_USER_EXTERNAL_PASSWORD}" authorities="ROLE_WSUSER" /> 
     </user-service> 
    </authentication-provider> 

</beans:beans> 

El problema es que sin importar el orden de las líneas de intercepción-url, la línea


<intercept-url pattern="/services/InitechAuthenticationService*" access="ROLE_WSUSER" /> 

siempre parece ser aplicado y la línea


<intercept-url pattern="/services/InitechAuthenticationService?wsdl" filters="none" /> 

se ignora. Hubiera esperado que uno pudiera controlar el comportamiento de alguna manera, p. especificando el orden (para que Spring Security seleccione la primera o la última regla de coincidencia) o por la especificidad de las reglas para que Spring Security seleccione la regla más específica, es decir, la que tiene "wsdl" al final en este caso. ¿Cómo puedo excluir la autentificación del documento WSDL, permitiendo al mismo tiempo la autenticación para usar realmente el WS?

Respuesta

4

Resolví el problema cambiando la parte http de la configuración para usar expresiones regulares en lugar del Ant Path Matcher. La configuración de trabajo completo está aquí:


<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
      http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.1.xsd"> 

    <http path-type="regex"> 
     <intercept-url pattern="/services/InitechAuthenticationService*" access="ROLE_WSUSER" /> 
     <intercept-url pattern="/services/InitechAuthenticationService\\?wsdl" filters="none" /> 
     <http-basic /> 
    </http> 

    <authentication-provider> 
     <user-service> 
      <user name="internal" password="${WS_USER_INTERNAL_PASSWORD}" authorities="ROLE_WSUSER" /> 
      <user name="external" password="${WS_USER_EXTERNAL_PASSWORD}" authorities="ROLE_WSUSER" /> 
     </user-service> 
    </authentication-provider> 

</beans:beans> 

Los cambios:

  1. añadido Texto de trazado "expresiones regulares" atributo a http
  2. cambiado? a \\? en el intercepto-url para wsdl
Cuestiones relacionadas