2011-01-12 18 views
12

que celebro un servicio web REST en una aplicación Grails, usando Spring Security, es decir .:Llamar a un servicio REST Web asegurado con Spring Security desde Android

@Secured(['IS_AUTHENTICATED_REMEMBERED']) 
def save = { 
    println "Save Ride REST WebMethod called" 
} 

estoy llamando desde una aplicación para Android. (Llamar al servicio no seguro funciona bien).

Para llamar al servicio, estoy compilando manualmente una solicitud (HttpUriRequest) y ejecutándola con un HttpClient.

Me pregunto lo que son las mejores prácticas, y cómo ponerlas en práctica ... Específicamente, debería:

  1. Realizar un inicio de sesión una vez, para recuperar un JSESSION_ID, a continuación, añadir una cabecera que contiene en HttpUriRequest para cada solicitud posterior?
  2. O (no estoy seguro de cómo iba a hacerlo incluso) incluir el nombre de usuario y contraseña directamente en cada solicitud, renunciando a la sesión/del lado del servidor de galletas

creo que puedo conseguir la opción 1 de trabajo, pero no estoy seguro si Spring Security lo permite (2), si ese es el camino a seguir ... ¡Gracias!

--además, no me falta ninguna biblioteca que haga todo esto por mí ¿verdad? :)

Respuesta

10

Spring security does admiten autenticación básica y autenticación basada en formularios (incrustación del nombre de usuario/contraseña en la URL).

Un servicio REST generalmente se autentica en todas y cada una de las solicitudes, normalmente no por una sesión. La autenticación de seguridad primaveral predeterminada (suponiendo que esté en 3.x) debe buscar parámetros de autenticación básicos o parámetros de formulario (j_nombre de usuario y j_contraseña) (en el formato http://you.com/rest_service?j_username=xyz&j_password=abc).

Insertar manualmente el j_nombre de usuario/j_contraseña en la URL, agregarlos como parámetros de publicación (creo), o establecer la autenticación básica nombre de usuario/contraseña deberían funcionar para autenticar un servicio REST contra los interceptores Spring Security predeterminados, directamente de la caja.

Admitiré que no he probado esto en los servicios REST, aunque recuerdo claramente haber leído exactamente esto en los documentos, ya que hice lo mismo con los inicios de página básicos en la seguridad de primavera recientemente. Descargo de responsabilidad

+4

Muchas gracias por la respuesta, estuvo cerca (las ideas me ayudaron mucho) pero no funcionó de fábrica: publiqué lo que se necesitaba para que funcionase: http://storypodders.com/dasBlog/2011/01/22/SecuringRESTServicesInGrailsWithSpringSecurity.aspx – Bobby

+0

Esa fue una gran publicación, gracias por contribuir, estoy seguro de que será encontrada y útil para muchos otros. –

+12

Poner nombre de usuario y contraseña en la URL generalmente se considera una mala idea. Los archivos de registro del servidor web a menudo contienen parámetros de consulta que expondrían sus credenciales. Cualquiera que acceda a su servicio RESTful desde un navegador tendría credenciales expuestas en su historial. – Patrick

9

Creo que puede utilizar un método de inicio de sesión y obtener un token que es similar a cómo funciona oauth.

enviar nombre de usuario y contraseña a través de la red fuera del canal seguro (https/ssl) es una idea terrible. cualquier persona en la red puede olfatear su paquete de solicitud y ver la contraseña de texto claro.

Por otro lado, si usa un método token, dado que la cadena token se genera aleatoriamente, incluso el token está en peligro, el peor caso es que alguien puede usar el token accediendo a su API REST.

otra solución está pasando por el túnel ssl (HTTPS). de hecho, he hecho una comparación y el resultado muestra: 80 solicitudes/minuto (https) frente a 300 solicitudes/minuto (http)

Cuestiones relacionadas