2012-01-10 28 views
16

Tenía la esperanza de que cambiar a create-session="stateless" sería el final para lograr la seguridad de muelles sin estado en mi aplicación web, pero no es así.create-session uso sin estado

Con ese cambio, la seguridad de primavera parece no funcionar, ya que (supongo) la seguridad de primavera no almacena nada en la sesión y no puede hacer la autenticación a las solicitudes web seguras.

¿Cómo hago uso de esta función stateless?

Parece que todavía no puedo encontrar ejemplos relevantes sobre cómo lograr la seguridad de muelles sin estado para una aplicación web sin estado.

¡Gracias!

Respuesta

18

Tengo una aplicación web basada en Spring que tiene una seguridad totalmente sin estado, y la única manera de hacerlo funcionar es desactivar completamente la creación de la sesión (con create-session="never"). Eso obliga a la reautenticación con cada solicitud, por lo que también querrá configurar la aplicación web para que use HTTP Basic Auth o Digest Auth (a través de HTTPS, por supuesto) ya que no requieren una negociación particularmente compleja (por el contrario, la forma el inicio de sesión basado en la base y OAuth ambos requieren una sesión porque tienen un proceso mucho más complicado para establecer el contexto de autenticación). Eso significa que querrá poner un elemento como <security:http-basic /> dentro de su elemento <security:http>.

(La ventaja de hacerlo de esta manera es que permite bibliotecas de cliente extremadamente simples ya que no tienen que gestionar cookies/sesiones. El costo es una sobrecarga de procesamiento: el establecimiento de qué conjunto de roles es el usuario participar como se tendrá que volver a calcular en cada solicitud y algunas limitaciones sobre los mecanismos de autenticación que puede usar)

+1

Gracias por la respuesta. Probé antes y digerir, pero me sentí muy incómodo al no poder 'cerrar sesión' desde mi aplicación web e ingresar una nueva credencial sin reiniciar el navegador. Además, ¿cree que poder escalar horizontalmente fácilmente para aplicaciones web/aplicaciones web sin estado justifica el costo de rendimiento? – bertie

+1

@Albert: Es difícil decir mucho sobre los costos sin medirlos de verdad. :-) Sin embargo, si desea cerrar la sesión, necesita _necesitar algún estado de cliente y eso significa que debe manejar las cookies; el cliente debe proporcionar algún tipo de indicación de la sesión de la que habla, ya que el HTTP mismo no tiene estado, y ese es un requisito difícil. –

+0

Lo que yo aconsejaría sin embargo es que no se preocupe demasiado por comenzar a escalar; conseguir usuarios/clientes es mucho más un problema. Al escalar, la verdadera clave es si puedes replicar un servicio o si tienes una instancia singleton; como regla general, los servidores web suelen ser relativamente fáciles de replicar, pero las bases de datos no lo son. –

24

La respuesta de Donal es básicamente correcta, y para un navegador probablemente no desee utilizar una aplicación sin estado.

Como referencia, create-session="stateless" es una mejor opción si realmente tiene una aplicación apátrida, como un cliente RESTful. Esta opción se introdujo en Spring Security 3.1. Evitará agregar partes de la infraestructura de Spring Security que hacen uso de la sesión (por ejemplo, HttpSessionSecurityContextRepository, SessionManagementFilter, RequestCacheFilter), por lo que obtendrá una configuración más sencilla.

Con create-session="never", Spring Security nunca creará una sesión en sí, sino que utilizará una si su aplicación lo hace. En la práctica, muchos usuarios ni siquiera son conscientes de que están creando sesiones, por lo que si realmente no desea una sesión, entonces, stateless es la mejor opción.

+0

+1: No sabía esa opción, pero aún no he profundizado demasiado en 3.1. –

+1

+1 Permítanme decir que esta respuesta, me salvó un mundo de dolor. Tomcat siguió negando el acceso a los usuarios porque mi cliente RESTful estaba creando tantas sesiones. ¡Gracias! – thatidiotguy

Cuestiones relacionadas