with tutorial example ejemplo spring spring-mvc spring-security configuration

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.

  1. Solo se permite un inicio de sesión concurrente.
  2. Cuando caduque la sesión HTTP, el usuario será redirigido a /security/sessionTimeout.html
  3. cuando el usuario inicia sesión con éxito, se le redirigirá a la carpeta "/".
  4. 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:

  1. Puedo iniciar sesión con la misma cuenta en 2 navegadores diferentes (no funciona el control de concurrencia)
  2. 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?