我是Spring的新手。我无法使用Spring安全注销。 登录工作正常,我在this post之后执行注销功能。
但我无法使其发挥作用。 这是我的spring-security.xml:
<security:http auto-config="true" use-expressions="true">
<security:intercept-url pattern="/index" access="hasRole('ROLE_USER')" />
<security:logout logout-success-url="/index" logout-url="/logout" />
</security:http>
<security:authentication-manager>
<security:authentication-provider>
<security:user-service>
<security:user name="matt3o" password="secret" authorities="ROLE_USER" />
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
这是我的index.jsp:
<c:if test="${pageContext.request.userPrincipal.name != null}">
<h2>Welcome : ${pageContext.request.userPrincipal.name}
</c:if>
<p><a href="logout">Logout</a></p>
请有人向我解释一下loggin / loggout的工作原理以及我退出的原因是什么?
在index.jsp中,我尝试以不同的方式注销,但没有一个能够正常工作:
<!--1-->
<c:url value="/logout" var="logoutUrl" />
<form id="logout" action="${logoutUrl}" method="post" >
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
</form>
<c:if test="${pageContext.request.userPrincipal.name != null}">
<a href="javascript:document.getElementById('logout').submit()">Logout</a>
</c:if>
<br><br>
<!--2-->
<a href="logout">logout1</a>
<br><br>
<!--3-->
<a href='<c:url value="j_spring_security_logout" />'>logout</a>
答案 0 :(得分:1)
Spring Security 4需要POST请求才能注销而不是GET。默认情况下,它旁边使用CSFR令牌进行保护,您需要将其添加到表单中(请参阅javadoc)。
因此,使用表单来调用注销,而不是链接。
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
<input type="submit" value="Log out" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
</form>
或使用安全标记库时
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}" method="post">
<input type="submit" value="Log out" />
<sec:csrfInput />
</form>
如果您想使用GET,请将注销功能配置为支持GET请求(为此您需要提供ant匹配器)或禁用CSFR,这可以通过将<sec:csfr disabled="true" />
添加到您的xml配置。
答案 1 :(得分:0)
你可以使用
href="<c:url value="/logout"/>"