【2,000円の講座をテキストにしてみました】 Springboot基礎講座4 〜ログイン認証と自作バリデーション〜


本テキストは、Springbootの基礎を学ぶことができるテキストです。
Springboot基礎講座1〜MVCモデルを理解する〜
Springboot基礎講座2 〜DB連携してCRUD実践〜
Springboot基礎講座3 〜検索機能とページングと非同期通信〜
・Springboot基礎講座4 〜ログインとセッション管理とバリデーション〜


本来は、2,000円で開いていた講座の内容を公開していたのを、テキストにして、一部有料(390円)で公開しています。


今ままでの講座
本講座は、今までの講座の続きとなっております。


本編

本講義では、Springのログイン認証機能の作り方、オリジナルのUserモデルでの認証のやり方、について学びます。

また、オリジナルのバリデーション方法についても学びます。

1. Spring Securityを使ったログイン/ログアウト

本講義では、Spring Securityというライブラリを使って実装します。​

    1.1 Spring Securityのライブラリを追加

それでは、Spring Securityをpom.xmlに以下の依存ライブラリとして追加しましょう。

        <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-security</artifactId>
       </dependency>
       
       <dependency>
		    <groupId>org.thymeleaf.extras</groupId>
		    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
		</dependency>

Springの主な認証機能は、spring-boot-starter-securityに入っています。
また、今回Thymeleaf上で、Spring Securityの機能を利用するため、thymeleaf-extras-springsecurity5も使用します。


    1.2 Spring Securityの概要

Webアプリケーションのセキュリティの機能を追加するフレームワークです。

例えば、ログインしたときのセッション情報を管理したり、認証機能を実施たり、CSRFトークンなどのセキュリティの設定もできます。

これにより悪質な外部からのアクセスからWebアプリケーションを守るようにしています。


Spring Securityは、以下のようなフローで実装されています。

スクリーンショット 2020-05-04 16.31.21

例えば、認証がされていない場合は、DefaultLoingPageGenerationFilterからログイン画面のレスポンスをクライアントに返します。

認証処理が成功した場合は、AuthenticationSuccessHandlerからログイン後の遷移先のレスポンスをクライアントに返します。

認証処理が失敗した場合は、AuthenticationFialureHandlerから失敗時の遷移先のレスポンスをクライアントに返します。


また、このSpring Securityの設定を行うWebSecurityConfigurerAdapterによって、ログイン画面のPATHやログイン成功時の遷移先などを設定することができます。

それでは、実装してみましょう。


    1.3  WebSecurityConfigurerAdapterの設定

それでは、Spring Securityの設定情報を作成するクラスを作成します。

パッケージ:com.sample.config
クラス名:WebSecurityConfig

package com.sample.config;

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.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	
   @Autowired
   LoginSuccessHandler loginSuccessHandler;

   @Autowired
   LoginFaildHandler loginFaildHandler;

	/**
    * Web全般のセキュリティ
    */
   @Override
   public void configure(WebSecurity web) {
       web.ignoring().antMatchers("/resources/**"); // resources配下は無視
   }

	/**
	 * http通信のセキュリティ  
	 */
   @Override
   protected void configure(HttpSecurity http) throws Exception {
   	
   	// 認証状態による画面表示の設定
   	http.authorizeRequests()
   		.antMatchers("/", "/search", "/signin", "/signup").permitAll()	//ログインしなくても画面表示できるPATH
   		.anyRequest().authenticated();	//その他のリクエストは認証が必要    		
   	
   	// ログイン処理の設定
       http.formLogin()
	        .loginPage("/signin") // ログイン画面のパス
           .defaultSuccessUrl("/")	//ログイン成功時のデフォルトリダイレクト先
	        .successHandler(loginSuccessHandler)	//ログイン成功時の処理
           .failureHandler(loginFaildHandler)	//ログイン失敗時の処理
           .usernameParameter("username")	// emailをログインに必要な値に設定
	        .passwordParameter("password")	// パスワード
	        .permitAll();
       
       // ログアウト処理の設定
       http.logout()
	        .logoutRequestMatcher(new AntPathRequestMatcher("/signout")) // ログアウト処理を起動させるパス
	        .logoutSuccessUrl("/") // ログアウト成功時の遷移先
	        .deleteCookies("JSESSIONID", "SESSION")	//ログアウト時にcookieのJSESSIONIDを削除
	        .invalidateHttpSession(true) // ログアウト時にセッションを無効にする
	        .permitAll();
   }
   
   /**
    * 認証の設定
    */
   @Override
   protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   	   // 初期ユーザーの設定
       auth.inMemoryAuthentication()
               .passwordEncoder(passwordEncoder())
               .withUser("test@rebelapp.com")
               .password(passwordEncoder().encode("test"))
               .roles("USER");
   }
   /**
    * パスワードをBCryptでエンコードする設定
    */
   @Bean
   public PasswordEncoder passwordEncoder() {
       return new BCryptPasswordEncoder();
   }

}

@Configurationをつけることで設定ファイルとして認識されます。

WebSecurityConfigurerAdapterは、以下のメソッドを実装します。
・void configure(WebSecurity web):Web全般に関わる設定
・void configure(HttpSecurity http):http通信時の設定
・void configure(AuthenticationManagerBuilder auth):認証管理の設定

        1.3.1 Web全般に関わる設定

ここから先は

33,859字 / 1画像

¥ 390

この記事が気に入ったらサポートをしてみませんか?