📝

はじめてのSpringBoot3 ~ログイン機能:デフォルト~

2020/12/17に公開1

はじめに

はじめまして
私はJavaを研修で少しかじった程度でSpringBootを使用した開発に参加し、てんやわんやしております森田和華です。
全く分からない中から少しずつ調べて実装をしていますが、自分の学習の為にも記事にして残しておこうと思い作成しております。
参考にしていただける際はそのあたりを念頭に置いたうえで参考にしていただければと思います。
もし私の記事を読んでおかしなところなどありましたらご指摘いただけると嬉しいです。
前回までの記事はこちらです。
はじめてのSpringBoot ~プロジェクトの作成~
はじめてのSpringBoot ~DB接続~

環境

SpringBootバージョン:2.4.0
Javaバージョン:8
DB:MySQL 8.0
IDE:eclipse

なぜログイン画面が表示されたのか?

今回の本題に入りたいと思います。
前回プロジェクトを起動できるようにDBの接続設定を設定ファイル(application.properties)を記載しましたが、その他のソースは記述していません。
それなのに起動すると

のようにログイン画面が表示されます。これはなぜなのか調査しました。
結論から言うとこれはプロジェクト作成時に設定した依存関係のSpringSecurityが適用されているために表示されるようです。

SpringSecurityとは

アプリケーションにセキュリティ対策機能を実装する際に使用されるフレームワークでサーブレットコンテナにデプロイするwebアプリケーションに対してセキュリティ対策を行う際によく利用されるようです。
SpringSecurityでは認証と認可という大きく二つの基本機能があります。
認証:アプリケーションを利用するユーザーの正当性を確認する機能を提供
認可:アプリケーションが提供するリソースや処理に対するアクセスを制御する機能を提供
ざっくりというと誰が(認証)どのページにアクセスできるか(認可)を制御する機能のようです。

SpringSecurityの準備

では原因がSpringSecurityにあると分かったところでログイン機能を実際に実装してみます。
まず、画面は表示されていますがSpringSecurityをちゃんと利用するには設定クラスが必要なようです。

WebSecurityConfig.java
package com.elpmas.test.controller;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * SpringSecurityを利用するための設定クラス
 * ログイン処理でのパラメータ、画面遷移や認証処理でのデータアクセス先を設定する
 */
@Configuration
@EnableWebSecurity //1
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {//2
    /**
     * 認可設定を無視するリクエストを設定
     * 静的リソース(image,javascript,css)を認可処理の対象から除外する
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
        		.antMatchers("/resources/**");//3
	/**
	* その他の例
	* .antMatchers("/images/**")
        * .antMatchers("/css/**")
        * .antMatchers("/javascript/**")
        * .antMatchers("/js/**")
	* ,で繋げて連続で書くことも可能
	* .antMatchers("/images/**","/css/**");
	*/
    }
}

<ソース内説明>
1,@EnableWebSecurityを設定する。SpringSecurityのConfigurationクラスがインポートされ利用するために必要なコンポートの定義が自動で行われる。
2,WebSecurityConfigurerAdapterを継承する。これによってデフォルトで適用されるBean定義を簡単にカスタマイズ出来る
3,セキュリティ対策が不要なリソースがある場合はSpringSecurityの処理を適用しないように設定する。

これでSpringSecurityが使用できるようです。

ログイン機能を実装する

ではまずフォーム認証を適用していきます。
先ほどのWebSecurityConfigクラスに追記していきます。

WebSecurityConfig.java
省略
import org.springframework.security.config.annotation.web.builders.HttpSecurity;

/**
 * SpringSecurityを利用するための設定クラス
 * ログイン処理でのパラメータ、画面遷移や認証処理でのデータアクセス先を設定する
 */
@Configuration
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 認可設定を無視するリクエストを設定
     * 静的リソース(image,javascript,css)を認可処理の対象から除外する
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring()
        		.antMatchers("/resources/**");
	/**
	* その他の例
	* .antMatchers("/images/**")
        * .antMatchers("/css/**")
        * .antMatchers("/javascript/**")
        * .antMatchers("/js/**")
	* ,で繋げて連続で書くことも可能
	* .antMatchers("/images/**","/css/**");
	*/
    }
    
    /**
     * 認証・認可の情報を設定する
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
	http.authorizeRequests()
		.antMatchers("/login").permitAll()//1
		.anyRequest().authenticated()//2
    
	http.formLogin() //3
		.defaultSuccessUrl("/sample") //4
    }
}

<ソース内説明>
1,ログインformをすべてのユーザーがアクセス可能にする
2,全てのURLリクエストは認証されているユーザーしかアクセスできないようにする
3,formLoginメソッドを呼び出しフォーム認証を有効にする。
4,ログイン成功時の遷移先指定

さらにログイン成功時の画面を作っておきます。

sample.html
ログイン完了

ソースの修正は以上ですので、起動してみます。

無事起動されました!
しかし問題が発生しました。入力を求められるユーザー名とパスワードを私は設定していません。
さて、何を入力すべきかと悩みますがデフォルトでは以下のようになっているようです。
Username:user
Password:起動時コンソール画面に表示される(写真の選択されている部分)

デフォルトに従いログインしますと無事ログインに成功しました。
認証成功画面

ログインに失敗するとこちらの画面に遷移します。
エラーメッセージまでデフォルトで出してくれるようです。すごいですね。
認証失敗画面

次回

今回は無事にログインが成功しました!
が、デフォルトのユーザー名とパスワードの使用では実務向きではないので次回はユーザー名とパスワードをDBで管理できるように変更を加えたいと思います。

参考文献

https://docs.spring.io/spring-security/site/docs/4.2.15.RELEASE/apidocs/org/springframework/security/config/annotation/web/configurers/AbstractAuthenticationFilterConfigurer.html

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発 (著 株式会社NTTデータ)
https://www.shoeisha.co.jp/book/detail/9784798142470

Discussion

ウージーウージー

初めまして。記事を拝見させていただき、参考になりました。
その中に、sampleに対応するControllerクラスについての部分が見当たらないのですが、そのまま実行すると、Not foundエラーになってしまい表示されないのですが、Controllerクラスは必要ないのでしょうか。