example - spring security tutorial
Configuración básica de Spring Security (1)
De la documentación de Spring Security :
Para utilizar la compatibilidad de sesión simultánea, deberá agregar lo siguiente a web.xml:
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
¿Agregaste esto?
Me gustaría configurar la aplicación Spring MVC con la seguridad Spring de la siguiente manera.
- Solo se permite un inicio de sesión concurrente.
- Cuando caduque la sesión HTTP, el usuario será redirigido a /security/sessionTimeout.html
- cuando el usuario inicia sesión con éxito, se le redirigirá a la carpeta "/".
- Cuando los usuarios cierran sesión, también se le redirigirá a "/".
Lo configuré de la siguiente manera:
<security:http>
<security:form-login login-page="/security/login.html" login-processing-url="/login" authentication-failure-url="/login.jsp?login_error=1" default-target-url="/"/>
<security:session-management invalid-session-url="/security/sessionTimeout.html">
<security:concurrency-control max-sessions="1" />
</security:session-management>
<security:logout logout-url="/logout" logout-success-url="/"/>
</security:http>
y tengo los siguientes problemas:
- Puedo iniciar sesión con la misma cuenta en 2 navegadores diferentes (no funciona el control de concurrencia)
- cuando hago clic en cerrar sesión me redirigen a "/security/sessionTimeout.html" en lugar de "/".
Seguí la guía de referencia de seguridad de Spring. ¿Qué estoy haciendo mal?
Actualizado: Así es como se ve mi web.xml.
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/springSecurity-servlet.xml</param-value>
</context-param>
<display-name>SpringSecurity</display-name>
<servlet>
<servlet-name>springSecurity</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springSecurity</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springSecurity</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springSecurity</servlet-name>
<url-pattern>/index.html</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
Actualización 2 : simplemente ejecute log4j en modo de depuración y esto es lo que obtuve al hacer clic en cerrar sesión:
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 1 of 11 in additional filter chain; firing Filter: ''ConcurrentSessionFilter''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 2 of 11 in additional filter chain; firing Filter: ''SecurityContextPersistenceFilter''
DEBUG [http-8080-2] (HttpSessionSecurityContextRepository.java:130) - No HttpSession currently exists
DEBUG [http-8080-2] (HttpSessionSecurityContextRepository.java:88) - No SecurityContext was available from the HttpSession: null. A new one will be created.
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 3 of 11 in additional filter chain; firing Filter: ''LogoutFilter''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 4 of 11 in additional filter chain; firing Filter: ''UsernamePasswordAuthenticationFilter''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 5 of 11 in additional filter chain; firing Filter: ''BasicAuthenticationFilter''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 6 of 11 in additional filter chain; firing Filter: ''RequestCacheAwareFilter''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 7 of 11 in additional filter chain; firing Filter: ''SecurityContextHolderAwareRequestFilter''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 8 of 11 in additional filter chain; firing Filter: ''AnonymousAuthenticationFilter''
DEBUG [http-8080-2] (AnonymousAuthenticationFilter.java:67) - Populated SecurityContextHolder with anonymous token: ''org.springframework.security.authentication.AnonymousAuthenticationToken@9055c2bc: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_ANONYMOUS''
DEBUG [http-8080-2] (FilterChainProxy.java:375) - /index.html at position 9 of 11 in additional filter chain; firing Filter: ''SessionManagementFilter''
DEBUG [http-8080-2] (SessionManagementFilter.java:87) - Requested session IDD8429BBAAA9561A97E1D2350ED63BC35 is invalid.
DEBUG [http-8080-2] (SessionManagementFilter.java:90) - Starting new session (if required) and redirecting to ''/security/sessionTimeout.html''
parece que tengo un filtro de administración de sesión aplicado en /index.html
y luego no existe sesión. ¿Cómo puedo resolverlo?