公式の例( Secure Web Content )によると、Spring Securityでログアウトを実行するために、フォームとボタンを使用する必要があります。ボタンの代わりにThymeleafとのリンクを使用する方法はありますか?
解決策(非推奨!)は次のとおりです。
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
.logoutSuccessUrl("/login");
上記のように、セキュリティのためにGETリクエストの代わりにPOSTを使用することをお勧めします。
ログアウトにはフォームを使用する必要があります。本当にリンクが必要な場合は、JavaScriptを使用して、非表示のフォームでリンクにPOSTを実行させることができます。
<a href="javascript: document.logoutForm.submit()" role="menuitem"> Logout</a>
<form name="logoutForm" th:action="@{/logout}" method="post" th:hidden="true">
<input hidden type="submit" value="Sign Out"/>
</form>
<a th:href="@{/logout}">Logout</a>
を正常に使用しました
私が使用した関連するSpringSecurity構成は
http
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login");
それが正しい答えです。
<form th:action="@{/logout}" method="post">
<input type="submit">POST LOGOUT</input>
</form>
この質問のコンテキストに関して、vdenotarisは、ログアウト機能の送信ボタンではなくリンクを必要としていると思います。さて、あなたができることは、このようなハイパーリンクを作成することだと思います:
<a href="#" th:href="@{/logout}">Log Out</a>
そして今、以下のマッピングでコントローラーを作成します:
@RequestMapping(value="/logout", method = RequestMethod.GET)
public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null){
new SecurityContextLogoutHandler().logout(request, response, auth);
}
return "redirect:/login?logout";
}
「CSRF攻撃からの保護を支援するために、デフォルトでは、Spring Security XmlConfigurationのログアウトには以下が必要です。
Hello Spring Security Xml Config
<form th:action="@{/logout}" method="post">
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}" />
<input type="submit">LOGOUT</input>
</form>