【Spring Security】ログアウト機能を作成する

SpringBootでログインログアウト機能を実装したいと思います。

本記事では、ログアウト機能のみを紹介します。

ログイン機能については、こちらの記事からお願い致します。

SpringBootのプロジェクト

以下の環境でログアウト機能を実装したいと思います。

実行環境

ProjectGradle
LanguageJava
SpringBoot3.1.1
PackagingJar
Java17

Dependenciesに入れるもの

  • Spring Web
  • Thymeleaf
  • Spring Security
  • PostgresSQL Driver

ログイン、ログアウト機能ということで、ユーザーやパスワードを記憶するデータベースを使います。

今回は、PostgreSQLというデータベースを使用します。

ログアウト機能のリンクを生成

ログイン成功時のページにリンクを生成します。

<!DOCTYPE html>
<html>
    <meta charset="UTF-8">
    <body>
        <h2>ようこそ</h2>
        <a href="/logout">ログアウト</a>
    </body>
</html>

SecurityConfig.javaに追記

ログアウト時のURLを指定し、指定ページ遷移する設定をします。

package com.example.demo;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
@EnableMethodSecurity
public class SecurityConfig {
    @Autowired
    private DataSource dataSource;

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
        http.authorizeHttpRequests(authorize->{
            authorize.anyRequest().permitAll();
        });
        http.formLogin(form->{
            form.defaultSuccessUrl("/home");
        });
        http.logout(logout ->{
            logout.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
            .logoutSuccessUrl("/login");
        });
        return http.build();
    }
    @Bean
    public UserDetailsManager userDetailsManager() {
        return new JdbcUserDetailsManager(this.dataSource);
    }
}

全文載せましたが、ログイン機能の記事から変更点は、33行目から36行目までになります。

http.logout(logout ->{
    logout.logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
    .logoutSuccessUrl("/login");
});

/logoutにアクセスするとログアウト処理をし、ログアウト成功時、/loginページに遷移するという内容になります。

実践

前回の記事のログイン成功時のページからログアウトをしようと思います。

作成したログアウトのリンクをクリックします。

すると、本当にログアウトしますかというページが出現します。

LogOutのボタンをクリックすると,,,

無事ログアウトされ、loginページが表示されました。