Estoy creando una aplicación web con Spring Security que vivirá en Amazon EC2 y usaré los Elastic Load Balancers de Amazon. Desafortunadamente, ELB no admite sesiones fijas, por lo que necesito asegurarme de que mi aplicación funcione correctamente sin sesiones.
Hasta ahora, he configurado RememberMeServices para asignar un token a través de una cookie, y esto funciona bien, pero quiero que la cookie caduque con la sesión del navegador (por ejemplo, cuando el navegador se cierra).
Tengo que imaginar que no soy el primero en querer usar Spring Security sin sesiones ... ¿alguna sugerencia?
spring
spring-security
load-balancing
amazon-ec2
Jarrod Carlson
fuente
fuente
Parece ser incluso más fácil en Spring Securitiy 3.0. Si está utilizando la configuración del espacio de nombres, simplemente puede hacer lo siguiente:
O bien, podría configurar el SecurityContextRepository como nulo, y nunca nada se obtendría salvado de esa manera así .
fuente
Trabajamos en el mismo problema (inyectando un SecurityContextRepository personalizado en SecurityContextPersistenceFilter) durante 4-5 horas hoy. Finalmente, lo descubrimos. En primer lugar, en el apartado 8.3 de Spring Security ref. doc, hay una definición de bean SecurityContextPersistenceFilter
Y después de esta definición, hay esta explicación: "Alternativamente, podría proporcionar una implementación nula de la interfaz SecurityContextRepository, lo que evitará que se almacene el contexto de seguridad, incluso si ya se ha creado una sesión durante la solicitud".
Necesitábamos inyectar nuestro SecurityContextRepository personalizado en SecurityContextPersistenceFilter. Así que simplemente cambiamos la definición de bean anterior con nuestro impl personalizado y lo pusimos en el contexto de seguridad.
Cuando ejecutamos la aplicación, rastreamos los registros y vimos que SecurityContextPersistenceFilter no estaba usando nuestro impl personalizado, estaba usando HttpSessionSecurityContextRepository.
Después de algunas otras cosas que probamos, nos dimos cuenta de que teníamos que dar nuestro impl SecurityContextRepository personalizado con el atributo "security-context-repository-ref" del espacio de nombres "http". Si usa el espacio de nombres "http" y desea inyectar su propio impl de SecurityContextRepository, pruebe el atributo "security-context-repository-ref".
Cuando se utiliza el espacio de nombres "http", se ignora una definición de SecurityContextPersistenceFilter separada. Como copié arriba, el documento de referencia. no dice eso.
Por favor corríjame si entendí mal las cosas.
fuente
Eche un vistazo a la
SecurityContextPersistenceFilter
clase. Define cómoSecurityContextHolder
está poblado. Por defecto usaHttpSessionSecurityContextRepository
para almacenar el contexto de seguridad en la sesión http.He implementado este mecanismo con bastante facilidad, con custom
SecurityContextRepository
.Vea lo
securityContext.xml
siguiente:fuente
En realidad
create-session="never"
, no significa ser completamente apátrida. Hay un problema para eso en la gestión de problemas de Spring Security.fuente
Después de luchar con las numerosas soluciones publicadas en esta respuesta, para intentar que algo funcione al usar el
<http>
configuración espacio de nombres, finalmente encontré un enfoque que realmente funciona para mi caso de uso. En realidad, no requiero que Spring Security no inicie una sesión (porque uso la sesión en otras partes de la aplicación), solo que no "recuerda" la autenticación en la sesión en absoluto (debe volver a verificarse cada solicitud).Para empezar, no pude averiguar cómo hacer la técnica de "implementación nula" descrita anteriormente. No estaba claro si se suponía que debía configurar securityContextRepository en
null
o en una implementación sin operación. El primero no funciona porqueNullPointerException
se tira a dentroSecurityContextPersistenceFilter.doFilter()
. En cuanto a la implementación sin operación, intenté implementar de la manera más simple que pude imaginar:Esto no funciona en mi aplicación, debido a algo extraño que
ClassCastException
tiene que ver con elresponse_
tipo.Incluso asumiendo que logré encontrar una implementación que funcione (simplemente no almacenando el contexto en la sesión), todavía existe el problema de cómo inyectar eso en los filtros construidos por la
<http>
configuración. No puede simplemente reemplazar el filtro en laSECURITY_CONTEXT_FILTER
posición, según los documentos . La única forma que encontré de conectarme alSecurityContextPersistenceFilter
que se crea debajo de las cubiertas fue escribir unApplicationContextAware
frijol feo :De todos modos, a la solución que realmente funciona, aunque muy pirateada. Simplemente use un
Filter
que borre la entrada de sesión queHttpSessionSecurityContextRepository
busca cuando hace lo suyo:Luego en la configuración:
fuente
WebSecurityConfigurerAdapter
http.addFilterBefore(new SpringSecuritySessionDeletingFilter(), SecurityContextPersistenceFilter.class)
Solo una nota rápida: es "crear sesión" en lugar de "crear sesiones"
crear sesión
Controla el entusiasmo con el que se crea una sesión HTTP.
Si no se establece, el valor predeterminado es "ifRequired". Otras opciones son "siempre" y "nunca".
La configuración de este atributo afecta las propiedades allowSessionCreation y forceEagerSessionCreation de HttpSessionContextIntegrationFilter. allowSessionCreation siempre será verdadero a menos que este atributo se establezca en "nunca". forceEagerSessionCreation es "falso" a menos que se establezca en "siempre".
Entonces, la configuración predeterminada permite la creación de sesiones pero no la fuerza. La excepción es si el control de sesión concurrente está habilitado, cuando forceEagerSessionCreation se establecerá en verdadero, independientemente de cuál sea la configuración aquí. El uso de "nunca" causaría una excepción durante la inicialización de HttpSessionContextIntegrationFilter.
Para obtener detalles específicos del uso de la sesión, hay buena documentación en el javadoc HttpSessionSecurityContextRepository.
fuente
auto-config=false
, aparentemente no puede reemplazar lo que está en laSECURITY_CONTEXT_FILTER
posición con el suyo. He estado pirateando tratando de deshabilitarlo con unApplicationContextAware
bean (usando la reflexión para forzarsecurityContextRepository
una implementación nulaSessionManagementFilter
) pero sin dados. Y, lamentablemente, no puedo cambiar a la seguridad de primavera de 3.1 años que proporcionaríacreate-session=stateless
.