【问题标题】:spring authentication: can't logout春季认证:无法注销
【发布时间】:2015-11-30 09:08:42
【问题描述】:

我是 Spring 新手。我无法使用 spring security 注销。 登录正常,我正在关注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 的工作原理以及为什么我的 logout 没有?

在 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>

【问题讨论】:

  • 那里没有什么可以登录的,所以你至少没有包含完整的配置。接下来你的链接是错误的 logout 是相对的,而你可能想要一个绝对 URL 到 /logout
  • 现在要发布以注销
  • @M.Deinum 我已将身份验证管理器添加到我的帖子中。这就是我在安全配置文件中的全部内容。登录工作正常。
  • 您使用哪个版本的 Spring Security?
  • 那么你需要发布登录而不是获取。因此,该链接无济于事,您需要一个表单并将其提交到注销 URL,并记住包含 csfr 令牌。

标签: spring spring-security


【解决方案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>

另请参阅参考指南中的 herehere

如果您想使用 GET,请配置注销功能以使其支持 GET 请求(为此您需要提供 ant 匹配器)或禁用 CSFR,这可以通过将 &lt;sec:csfr disabled="true" /&gt; 添加到您的 xml 配置来完成.

【讨论】:

  • 好的,我添加了第一个表单以注销。我正在使用 Spring MVC,所以我的控制器中确实没有任何 POST 或 GET 方法。
  • IT 与您的控制器无关... Spring Security 正在处理注销而不是您...。我有一个/logout 的控制器,您基本上是在破坏 Spring Securities 注销功能。
  • 好的。我的控制器中没有任何 /logout /login 重定向。
【解决方案2】:

你可以使用

href="<c:url value="/logout"/>"

【讨论】:

  • 是的,我尝试使用 注销跨度>
猜你喜欢
  • 1970-01-01
  • 2019-02-04
  • 2018-07-04
  • 2011-11-11
  • 2016-01-21
  • 2016-06-09
  • 2015-08-09
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多