2012-08-03 11 views
7

Me refería al subproceso this, y en el segundo último mensaje por Rob Winch (Spring Security Lead), menciona que podemos tener acceso a la sessionRegisty:seguridad de primavera - hay una forma de obtener el registro de sesión dentro de mi aplicación (sin personalizar explícitamente el filtro concurrent)

<session-management> 
    <concurrency-control session-registry-alias="sessionRegistry"/> 
</session-management> 

por lo tanto, me registro en el filtro HttpSessionEventPublisherweb.xml y especificar el ajuste anterior en mi sección <http>. Me NO añadir lo siguiente:

<beans:bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl" /> 

y en mi clase, me inyecto una instancia de sessionRegistry así:

@Autowired 
private SessionRegistry sessionRegistry 

Ésta es la forma en que estoy tratando de averiguar las sesiones para una usuario:

List<SessionInformation> userSessions = sessionRegistry.getAllSessions(username,false); 
     for (SessionInformation userSession : userSessions){ 
      userSession.expireNow(); 
     } 

El principal es el nombre de usuario del usuario. Al depurar, las variables sessionRegistry de la variable principals y sessionids están vacías. ¿Estoy haciendo algo mal aquí, o son los pasos mencionados por krams's blog, la única forma de hacerlo?

+0

¿Qué no funciona? – Xaerxess

+0

@Xaerxess: la variable sessionRegistry que se inserta no tiene identificadores de sesión ni autenticación. Tenga en cuenta que no he definido el bean sessionRegistry explícitamente – Daud

+0

¿Se puede publicar el código de clase que accede a 'sessionRegistry'? ¿Cómo se verifica si el registro está vacío? – Xaerxess

Respuesta

1

Demasiado tiempo para hacer comentarios, así que respondo.

  1. Turn depuración de Seguridad del resorte en (añadir a log4j.properties línea log4j.logger.org.springframework.security=DEBUG). Este debería ser el procedimiento estándar en tales problemas, ya que la depuración imprime mucha información práctica que puede mostrar si el problema es.

  2. ¿Se puede depurar si se llama al método public void registerNewSession(String sessionId, Object principal) dentro de SessionRegistryImpl después del registro? Si no eso significa que HttpSessionEventPublisher no está configurado correctamente.

  3. Usas @Autowired private SessionRegistry sessionRegistry; en tu clase, ¿no es así?

  4. EDIT: ¿Puede verificar si hay algún principal en el registro?

    List<Object> userSessions = sessionRegistry.getAllPrincipals(); 
    

    donde Object s son las instancias principales que utiliza.

+3

Esto está marcado como una respuesta, pero ¿cuál es la respuesta? Me gustaría ver si puedo usar SessionRegistry sin habilitar el control de concurrencia. – Eyal

+0

@Eyal, ¿encontró la solución? – msangel

+0

No. Terminé abandonando la idea de usar SessionRegistry y escribir mi propia extensión HttpSessionListener en su lugar. – Eyal

2

Bueno, puede autoautar sessionRegistry. Nada está mal. Lo usé para rastrear SessionInformation y sesiones registradas para UserPrincipal

+0

Pero es lo que he configurado suficiente para eso? – Daud

+0

si está utilizando una configuración mixta (como el xml y las anotaciones anteriores), entonces es correcta. Autowire sessionfactory con la interfaz como: '@Automobile sessionRegistry sessionRegistry;'. Porque en su enlace provisto, el bean autowired en la clase es 'SessionRegistryImpl'. Su configuartion xml para sessionfactory es correcto. –

+0

Lo tengo para trabajar exactamente con la misma configuración .. – Daud

2

sólo funcionaba para mí si he cambiado de sesión en el Registro-alias de sesión de registro-ref, y luego definieron los impl por defecto:

<security:session-management> 
    <security:concurrency-control max-sessions="10" session-registry-ref="sessionRegistry"/> 
</security:session-management> 

<bean id="sessionRegistry" class="org.springframework.security.core.session.SessionRegistryImpl"/> 
1

así que depende de la versión de seguridad de la primavera se utilizar.

En Spring Security 3.0 es suficiente para tener la configuración de la siguiente manera:

<security:session-management> 
    <security:concurrency-control max-sessions="1"/> 
</security:session-management> 

Debido clase internamente se utiliza ConcurrentSessionControlStrategy que invoca registerNewSession en sessionRegistry objeto.

En la primavera de Seguridad 3.2 que es diferente y hay que utilizar una configuración más detallada. Hay un ejemplo en el Spring Security reference doc La parte más importante tener sessionRegistry lleno de datos son los siguientes:

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.CompositeSessionAuthenticationStrategy"> 
    <beans:constructor-arg> 
    <beans:list> 
     <beans:bean class="org.springframework.security.web.authentication.session.ConcurrentSessionControlAuthenticationStrategy"> 
     <beans:constructor-arg ref="sessionRegistry"/> 
     <beans:property name="maximumSessions" value="1" /> 
     </beans:bean> 
     <beans:bean class="org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy"> 
     <beans:constructor-arg ref="sessionRegistry"/> 
     </beans:bean> 
    </beans:list> 
    </beans:constructor-arg> 
</beans:bean> 

<beans:bean id="sessionRegistry" 
    class="org.springframework.security.core.session.SessionRegistryImpl" /> 

El registro de una nueva sesión en sessionRegistry se realiza en RegisterSessionAuthenticationStrategy clase.

Espero que te ayude.

Cuestiones relacionadas