2012-03-22 13 views
6

La forma básica en que entiendo que el SecurityUtils.getSubject() de Shiro funciona es que devuelve el asunto que está vinculado al subproceso que se está ejecutando actualmente. Sin embargo, esto parece estar en desacuerdo con un contenedor de servlets como Tomcat que está utilizando un grupo de subprocesos para atender las solicitudes.Shiro en un entorno de subprocesos múltiples

Si se dice que Tomcat usa ThreadA para manejar solicitudes, cualquier llamada a SecurityUtils.getSubject() debería funcionar bien. Pero, tan pronto como se selecciona ThreadB, el usuario se pierde, getSubject devuelve null y isAhenthenticated ahora es falso. Esto es aunque el usuario todavía está conectado.

He confirmado esto en mi aplicación. Estoy usando Shiro Core 1.2 y noto que mi usuario está autenticándose milagrosamente cuando navego por mi aplicación. Si miro los registros, el problema ocurre tan pronto como se usa un hilo diferente para atender la solicitud.

Entonces, ¿tengo Shiro configurado incorrectamente? Parece que el 'usuario actual' debe estar vinculado a algo un poco más duradero que el hilo actual. Esperaría que sea basado en la sesión. Sé que Shiro tiene administración de sesiones, pero en todos los ejemplos que he encontrado, dice que para obtener al usuario actual llame al getSubject, que mira el ThreadContext. ¿Me estoy perdiendo de algo?

Respuesta

12

Por lo tanto, resulta que simplemente no tenía Shiro configurado correctamente. Tengo una aplicación web, pero estaba configurando Security Manager en el código. Esto dio como resultado que Security Manager se configure solo en un determinado hilo. Siempre que las solicitudes reciban el mismo hilo, funcionó bien. Pero tan pronto como Tomcat eligió un hilo diferente, el usuario apareció autenticado.

Shiro tiene un filtro para aplicaciones web que maneja este escenario y vincula al usuario a cada solicitud entrante. Debe tener su aplicación configurada de la siguiente manera en lugar de hacer el administrador de seguridad en el código:

<context-param> 
    <param-name>shiroConfigLocations</param-name> 
    <param-value>classpath:auth.ini</param-value> 
</context-param> 

<!-- Shiro Environment Listener --> 
<listener> 
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 

<!-- Shiro Filter Configuration --> 
<filter> 
    <filter-name>ShiroFilter</filter-name> 
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>ShiroFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
+0

Gracias por informar de nuevo con esta respuesta bien escrita sma! –

+0

Tengo alguna pregunta sobre 'SecurityUtils.getSubject()'. Dado que hay un grupo de subprocesos en contenedor Tomcat, ¿un subproceso puede estar vinculado a multiláminas? – znlyj

Cuestiones relacionadas