LoginSignup
2
1

More than 1 year has passed since last update.

Spring Security その2.5〜デフォルトのログアウト画面

Posted at

カスタムログインページを作成する中で、ログアウト処理で少しハマってしまったので、先にその話を

.formlogin()を実装すると/logoutのデフォルト画面は提供されなくなる

.formlogin()を実装する前はGETリクエスト(URL直接指定)でも/logoutへの遷移が可能であった。
image.png

上記の画面が表示され、Log Outボタンを押下することでログアウト処理が実施され、ログアウトを行うことができた。

しかし、.formlogin()を実装後に/logoutへGETリクエストを送信すると以下のエラーとなる
image.png

色々調べたら、.formlogin()を実装するとデフォルトのログアウト画面(正確にはログアウトを行うための画面)は提供されなくなり、直接ログアウト処理を呼び出すことになるらしい・・・

/logoutへはPOSTリクエストである必要がある

では、なぜ、直接ログアウト処理を呼び出すとエラーとなるのか。
それは/logoutへのリクエストはPOSTである必要があるから。
SpringSecurityでは、GETリクエスト時はCSRFのチェックは行わないが、ログアウトの時はCSRFトークンのチェックを行うらしい。
GETではCSRFトークンは送信されないので、エラーとなる。

解決策

/logoutへはPOSTでCSRFトークンを送信してあげる
やり方は簡単。Thymeleafで「th:action」でPOST送信するだけで、CSRFトークンを送信してくれます。
具体的にはこんな感じ

    <form th:action="@{/logout}" method="post">
        <input type="submit" name="logout" value="ログアウト"/>
    </form>

これでログアウトが可能となり、.formloinの実装(カスタムログインページ)ができるようになる。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1