web-dev-qa-db-ja.com

SpringおよびThymeleafとのログアウトリンク

公式の例( Secure Web Content )によると、Spring Securityでログアウトを実行するために、フォームとボタンを使用する必要があります。ボタンの代わりにThymeleafとのリンクを使用する方法はありますか?

16
vdenotaris

解決策(非推奨!)は次のとおりです。

       .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/login");

上記のように、セキュリティのためにGETリクエストの代わりにPOSTを使用することをお勧めします。

9
vdenotaris

ログアウトにはフォームを使用する必要があります。本当にリンクが必要な場合は、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> 
23
skouda

<a th:href="@{/logout}">Logout</a>を正常に使用しました

私が使用した関連するSpringSecurity構成は

 http
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login");
16
geoand

それが正しい答えです。

<form th:action="@{/logout}" method="post">
    <input type="submit">POST LOGOUT</input>
</form>
8
CESCO

この質問のコンテキストに関して、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";
}
8
Prahlad Awasthi

「CSRF攻撃からの保護を支援するために、デフォルトでは、Spring Security XmlConfigurationのログアウトには以下が必要です。

  • hTTPメソッドはPOSTである必要があります
  • cSRFトークンをリクエストに追加する必要があります。上に示したように、属性_csrfを使用してServletRequestでアクセスできます。」

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