2011-08-24 28 views
8

En SpringSecurity tiene un nombre de clase SecurityContextHolder y su especificación: 'Asocia un SecurityContext dado con el hilo de ejecución actual.' Con la aplicación web cada vez que llega una solicitud al servidor, entonces Spring también vuelve a cargar y establece SecurityContext de esa solicitud en SecurityContextHolder para su hilo.¿Cómo gestiona Spring Security SecurityContext en un hilo entre las solicitudes de aplicaciones web?

+0

Por favor, vea http://stackoverflow.com/questions/6408007/spring-securitys-securitycontextholder-session-or-request-bound – Ritesh

Respuesta

7

Con la aplicación web cada vez que llega una solicitud al servidor, entonces Spring también vuelve a cargar y establece SecurityContext de esa solicitud en SecurityContextHolder para su hilo?

Básicamente sí.

El comportamiento predeterminado de SecurityContextHolder.getInstance() es devolver una instancia SecurityContextHolder que almacenó como un subproceso local del subproceso actual. (Esto es sólo el mecanismo por defecto. Se puede utilizar una estrategia diferente para localizar el SecurityContextHolder llamando SecurityContextHolder.setStrategemName())

A filtros SpringSecurity asegurar que de la solicitud SecurityContextHolder (sin embargo se encuentra) se carga con las credenciales de petición al inicio y que el titular se borra al final del proceso de solicitud.

+0

Elaborar, la clave es que el filtro se ve en los atributos de la invocación remota de la seguridad contexto. Solo si hay un contexto de seguridad en los atributos de invocación remota, puede configurarse en SecurityContextHolder. Este contexto de seguridad normalmente se suministra desde el cliente con un filtro similar que procesa la invocación saliente y coloca el contexto de seguridad desde el hilo local en la invocación remota. – Zach

+0

[¿Por qué esto no funciona] (https://github.com/spring-projects/spring-security/issues/3919) para mí? Ver [pregunta de stackoverflow] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not-shared-across-thread). – displayname

9

Sí, el SecurityContextPersistenceFilter se encarga de esto. Por defecto, localiza el SecurityContext en la HttpSession y lo vincula al hilo a través de SecurityContextHolder. Cuando la solicitud finaliza el proceso, realiza el proceso inverso: toma el SecurityContext del hilo y lo coloca en la sesión.

Desde el Javadoc:

rellena la SecurityContextHolder con información obtenida de la configurado SecurityContextRepository antes de la solicitud y almacena de nuevo en el depósito una vez que la solicitud ha completado y despejar el titular contexto. Por defecto usa un HttpSessionSecurityContextRepository.

+0

¿No debería eso también hacerlo seguro para hilos? Parece que 'SecurityContext' no se comparte entre subprocesos en mi aplicación ([link] (http://stackoverflow.com/questions/34273755/why-is-the-authentication-object-of-the-securitycontext-not -shared-across-thread)). – displayname

Cuestiones relacionadas