2011-12-21 28 views
8

He utilizado spring security 3.0.7 y estoy implementando control de concurrencia en mi proyecto. Pero no está funcionando. He utilizadoSpring Concurrency Control

<security:session-management> 
      <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/> 
</security:session-management> 

Incluso he intentado solución de spring security reference pero no funcionó. Aquí está mi configuración de contenido de archivo:

<session-management session-authentication-strategy-ref="sas"/> 
</http> 

<beans:bean id="concurrencyFilter" 
    class="org.springframework.security.web.session.ConcurrentSessionFilter"> 
    <beans:property name="sessionRegistry" ref="sessionRegistry" /> 
    <beans:property name="expiredUrl" value="/session-expired.htm" /> 
</beans:bean> 

<beans:bean id="myAuthFilter" class= 
    "org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"> 
    <beans:property name="sessionAuthenticationStrategy" ref="sas" /> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
</beans:bean> 

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

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

estoy consiguiendo siguiente excepción:

org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Filter beans '<myAuthFilter>' and '<org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#0>' have the same 'order' value. When using custom filters, please make sure the positions do not conflict with default filters. Alternatively you can disable the default filters by removing the corresponding child elements from <http> and avoiding the use of <http auto-config='true'>. 
Offending resource: class path resource [config/auth.xml] 
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) 
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) 
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:72) 
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.checkFilterChainOrder(HttpSecurityBeanDefinitionParser.java:196) 
    at org.springframework.security.config.http.HttpSecurityBeanDefinitionParser.parse(HttpSecurityBeanDefinitionParser.java:132) 
    at org.springframework.security.config.SecurityNamespaceHandler.parse(SecurityNamespaceHandler.java:86) 
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1338) 
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1328) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135) 
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:93) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) 
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) 

¿Alguien puede ayudar con esta pregunta?

+0

¿Se puede definir * no funciona *? Tengo '' solo y después de iniciar sesión con el segundo navegador, se cierra la sesión del primer navegador. –

+0

en mi caso cuando inicio sesión con un segundo navegador, inicia sesión, incluso lo probé desde el tercer navegador. –

+0

De hecho, iniciará sesión utilizando el segundo navegador. ¿Funciona el acceso posterior desde el primer navegador? – Raghuram

Respuesta

2

Si usted ha escrito UserPrincipal y UserPrincipalImpl (su propia aplicación), debe reemplazar equals() y hashCode() métodos de objeto.

+0

hola, ¿podría aclararnos más sobre esta solución? Qué sucede si tiene una autenticación personalizada (implemente 'AuthenticationProvider'). ¿Esta configuración ya sería suficiente? ' ' – Oneb

1

añadir lo siguiente a web.xml:

<listener> 
    <listener-class> 
     org.springframework.security.web.session.HttpSessionEventPublisher 
    </listener-class> 
    </listener> 
+0

¡Sí! He agregado pero esa es mi propia clase que extiende org.springframework.security.web.session.HttpSessionEventPublisher –

4

Si se utiliza el elemento de concurrency-control espacio de nombres, un ConcurrentSessionFilter will be added to the filter chain de forma automática, por lo tanto, no se puede utilizar custom-filter añadir uno en el mismo lugar o se obtendrá este error.

El mismo problema se producirá si se utiliza form-login (o auto-config) y intenta agregar un UsernamePasswordAuthenticationFilter usando custom-filter. Parece que eso está causando el problema específico que tienes aquí (con tu bean myAuthFilter).

Probablemente deberías agregar el resto de la configuración del elemento http a la pregunta para que sea más obvia de dónde viene el conflicto.

1

Tengo el siguiente applicationContext-security.xml y funciona perfectamente

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <context:component-scan base-package="com.mycompany.test"/> 

    <security:http use-expressions="true"> 
     <security:http-basic/> 
     <security:intercept-url pattern="/**" access="isAuthenticated()" /> 
     <security:session-management> 
      <security:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/> 
     </security:session-management> 
    </security:http> 


    <security:global-method-security secured-annotations="enabled"/> 

    <security:authentication-manager> 
     <security:authentication-provider> 
      <security:user-service> 
       <security:user name="restuser" password="restuser" authorities="ROLE_RESTCLIENT"/> 
      </security:user-service> 
     </security:authentication-provider> 
    </security:authentication-manager> 

</beans> 

Para probar correctamente usted debe hacer lo siguiente: abrir los sitios web en dos navegadores diferentes y borrar las cookies. La primera vez que puede iniciar sesión la segunda vez, no. Debería ver el formulario de autenticación HTTP que muestra el navegador en ambos casos. Si no lo ves significa que ya estás autenticado en una sesión anterior, por lo tanto, debes eliminar tus cookies. (Para estar en el lado seguro usted debe probarlo con dos navegadores diferentes de lo contrario las galletas MITH puede compartir)

4

La documentación dice:

añade soporte para el control de sesión simultánea, lo que permite poner límites en el cantidad de sesiones activas que un usuario puede tener. Se creará un ConcurrentSessionFilter, y se usará un ConcurrentSessionControlStrategy con el SessionManagementFilter. Si se ha declarado un elemento de inicio de sesión de formulario, el objeto de estrategia también se inyectará en el filtro de autenticación creado. Se creará una instancia de SessionRegistry (una instancia de SessionRegistryImpl a menos que el usuario desee usar un bean personalizado) para que la utilice la estrategia.

Así que no puede usar la etiqueta de filtro personalizado aquí. Es por eso que podría estar dando error. Tomé el contenido anterior de esta URL.Mira esto:

Referencia: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#nsa-concurrency-control

Cuestiones relacionadas