カスタムログインページを作成する中で、ログアウト処理で少しハマってしまったので、先にその話を
.formlogin()を実装すると/logoutのデフォルト画面は提供されなくなる
.formlogin()を実装する前はGETリクエスト(URL直接指定)でも/logoutへの遷移が可能であった。
上記の画面が表示され、Log Outボタンを押下することでログアウト処理が実施され、ログアウトを行うことができた。
しかし、.formlogin()を実装後に/logoutへGETリクエストを送信すると以下のエラーとなる
色々調べたら、.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の実装(カスタムログインページ)ができるようになる。