java - springutilities - Seguridad de primavera: 404 en cierre de sesión
swing java layout (3)
Cuando trato de acceder a la URL de cierre de sesión de mi aplicación Spring, aparece un error 404 y No mapping found for HTTP Request with URI [/logout] in DispatcherServlet with name ''mvc-dispatcher''
en el registro de mi servidor.
Ya he intentado Llamar a j_spring_security_logout que no funciona , Problema con el cierre de sesión de seguridad de Spring y casi todos los resultados relacionados en SO.
Incluyo los archivos de configuración completos, ya que la estructura xml de Spring todavía no está del todo clara.
Mi configuración de seguridad:
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">
<http pattern="/resources/**" security="none" />
<http auto-config="true">
<intercept-url pattern="/login*" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/**" access="ROLE_USER" />
<form-login login-page="/login" default-target-url="/"/>
<logout logout-url="/logout" />
<csrf />
</http>
<global-method-security secured-annotations="enabled" />
<authentication-manager>
<authentication-provider user-service-ref="userDetailsService" />
</authentication-manager>
</beans:beans>
Mi web.xml
es este:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>XYZ</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/*-config.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
¿Cómo hago para que la página de cierre de sesión funcione?
Para resolver esto, generalmente se requiere convertir un enlace de cierre de sesión en un botón de formulario POST con token CSRF oculto, que se puede lograr mediante:
<a href="#" onclick="document.getElementById(''logout-form'').submit();"> Logout </a>
<form id="logout-form" action="<c:url value="/logout"/>" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
Si está utilizando logout con CSRF debe realizar un POST. Consulte http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#csrf-logout
Tuve el mismo problema después de migrar de Spring 3.2 a 4, pero quería cerrar sesión usando un enlace en la vista.
La documentación de Spring ( http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#csrf-include-csrf-token-form ) explica cómo hacerlo en la vista.
Utilicé este fragmento de código en la JSP para hacer el cierre de sesión:
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form action="${pageContext.request.contextPath}/logout" method="POST">
<input type="submit" value="Logout" />
</form:form>