2012-08-14 21 views
9

Tengo la seguridad de muelles configurada usando la autenticación básica y basada en formulario según auto-config='true'.¿Cómo puedo desactivar el inicio de sesión basado en formulario de primavera para puntos finales RESTful?

Me gustaría que los puntos finales en /api/** NO usen la seguridad basada en formularios. Otros puntos finales fuera de /api/** deben usar el inicio de sesión basado en el formulario. Me gustaría que se enviara una respuesta 401 a cualquier llamada para estos puntos finales que no proporcionaron credenciales bajo /api/**.

ACTUALIZACIÓN: Gracias al comentario de Luke Taylor a continuación, he encontrado la siguiente solución.

NOTA: Esta técnica solo se puede aplicar a partir de Spring-security 3.1.

Primero llamé /api/**. Nunca creamos una sesión aunque use una si está disponible, esto es manejado por create-session="never" y el uso de <session-management/>.

<http pattern="/api/**" create-session="never" use-expressions="true"> 
    <http-basic /> 
    <session-management /> 
    <intercept-url pattern="/api/**" access="hasRole('API_ACCESS')"/> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/" access="permitAll"/> 
    <intercept-url pattern="/**" access="isAuthenticated()"/> 
</http> 
+1

Mira aquí http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/. En este tutorial puedes encontrar algunas respuestas a tus preguntas. – dimas

+1

Vea mi respuesta a [esta pregunta] (http://stackoverflow.com/questions/9302795/handling-both-form-and-http-basic-authentication-with-different-sources) que esencialmente está preguntando lo mismo. –

+0

Hola Luke, en teoría, esto parece lo que busco e investigaré su aplicación. Al tener múltiples etiquetas '' podrían accidentalmente manejar la solicitud? Tal vez pueda usar SpEL para que coincida con cualquier cosa que no sea '/ api'. No sabía que en primavera-seguridad 3.1 ahora permiten múltiples etiquetas '', esto es algo bueno. –

Respuesta

19

Con Spring Security 3.1, su mejor opción es la de dividir las partes de descanso y no reparador de su aplicación en las cadenas de filtro separadas mediante el uso de dos elementos separados <http>. La cadena API relajante se puede configurar para que sea sin estado y usar autenticación básica, mientras que la cadena predeterminada puede usar una configuración de inicio de sesión normal.

A continuación, tendría algo así como:

<http pattern="/api/**" create-session="stateless"> 
    <intercept-url pattern="/api/**" access="ROLE_API_USER" /> 
    <http-basic />   
</http> 

<!-- No pattern attribute, so defaults to matching any request --> 
<http> 
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login />   
</http> 

Las definiciones de la cadena deben ser solicitados a patrón más específica a más general, por lo que la cadena por defecto viene al final.

+0

Excelente Luke, muchas gracias por publicar la respuesta. Debería haber leído los documentos de 3.1 para descubrir esto, ya que es una característica nueva pequeña pero poderosa. :) –

+0

Creo que el atributo create-session debe establecerse en 'create-session =" never "' según esta publicación: http://stackoverflow.com/questions/16914985/spring-security-either-http-basic- or-form-login-authentication – lanoxx

+0

@lanoxx no si desea que su aplicación sea completamente apátrida y nunca tenga una sesión. –

Cuestiones relacionadas