Spring Boot セキュリティ関連

Spring Boot上でSpring SecurityのBasic認証を利用してみた

Spring Securityには、セキュリティ対策の基本機能として「認証」「認可」機能が含まれる。詳細は以下のサイトを参照のこと。
https://terasolunaorg.github.io/guideline/5.1.0.RELEASE/ja/Security/SpringSecurity.html#springsecurityfunctionalities

今回は、Spring Securityを利用して、ユーザー名・パスワードによる認証を行う「Basic認証」を行うサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

Spring Bootで全角チェック処理を行う独自アノテーションを作成してみたSpring Bootの独自アノテーションで、特定のフィールドに対するチェック処理も実装することができる。今回は、特定のフィールドの全角...

サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから変更したプログラムである。

build.gradleの内容は以下の通りで、「spring-boot-starter-security」をライブラリに追加している。

plugins {
	id 'org.springframework.boot' version '2.1.7.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

configurations {
	//log4j2を利用するため、Spring BootデフォルトのLogbackを利用しないよう設定
	all*.exclude module : 'spring-boot-starter-logging'
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	compileOnly 'org.projectlombok:lombok:1.18.10'
	annotationProcessor 'org.projectlombok:lombok:1.18.10'
	compile files('lib/ojdbc6.jar')
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.1'
	compile group: 'org.springframework.data', name: 'spring-data-commons-core', version: '1.1.0.RELEASE'
	//log4j2を利用するための設定
	compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.12.1'
	compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.12.1'
	//AOPを利用するための設定
	compile group: 'org.aspectj', name: 'aspectjweaver', version: '1.6.10'
	//log4j2の設定でymlファイルを利用するための設定
	compile group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml', version: '2.10.1'
	compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.1'
	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.10.1'
	//Apache Common JEXLを利用するための設定
	compile group: 'org.apache.commons', name: 'commons-jexl3', version: '3.0'
	//Spring Securityの設定
	implementation 'org.springframework.boot:spring-boot-starter-security'
}

なお、前提条件のプログラムからbuild.gradleのみを修正した場合、以下のユーザー認証画面が表示される。
SpringSecurityデフォルト認証画面

また、application.ymlの内容は以下の通りで、「spring.security.user.name」にユーザー名を、「spring.security.user.password」にパスワードを指定している。ここで定義した、ユーザー名「user」・パスワード「pass」を指定した場合のみ、Basic認証のログインができるようになっている。

server:
  port: 8084
spring:
  # DB接続情報
  datasource:
    url: jdbc:oracle:thin:@localhost:1521:xe
    username: USER01
    password: USER01
    driverClassName: oracle.jdbc.driver.OracleDriver
  # SpringSecurityユーザー情報
  security:
    user:
      name: user
      password: pass
# 一覧画面で1ページに表示する行数
demo:
  list:
    pageSize: 2



さらに、以下のWebSecurityConfigurerAdapterクラスを継承したクラスで、Spring Securityの認証方法の定義を行っている。この設定で、初期表示画面を表示した場合に、Basic認証のログイン画面が表示されるようになっている。

package com.example.demo;

import org.springframework.context.annotation.Configuration;
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.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.firewall.DefaultHttpFirewall;

@Configuration
@EnableWebSecurity
public class DemoSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        //org.springframework.security.web.firewall.RequestRejectedException:
        //The request was rejected because the URL contained a potentially 
        //malicious String ";"というエラーログがコンソールに出力されるため、下記を追加
        DefaultHttpFirewall firewall = new DefaultHttpFirewall();
        web.httpFirewall(firewall);
    }

    /**
     * SpringSecurityによる認証を設定
     * @param http HttpSecurityオブジェクト
     * @throws Exception 例外
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //初期表示画面を表示する際にBasic認証を実施する
        http.antMatcher("/").httpBasic()
                .and()   //かつ
                //それ以外の画面は全て認証を有効にする
                .authorizeRequests().anyRequest().authenticated()
                .and()   //かつ
                //リクエスト毎に認証を実施するようにする
                .sessionManagement().sessionCreationPolicy(
                                 SessionCreationPolicy.STATELESS);
    }
}

その他のソースコード内容は、以下のサイトを参照のこと。
https://github.com/purin-it/java/tree/master/spring-boot-security-basic/demo

サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) Spring Bootアプリケーションを起動し、「http:// (ホスト名):(ポート番号)」とアクセスすると、以下のBasic認証画面が表示される
サンプルプログラムの実行結果_1

2) application.ymlに定義したユーザーと違うユーザー名またはパスワードを入力し、「OK」ボタンを押下
サンプルプログラムの実行結果_2

3) 以下のように、ログインができず、再度Basic認証の画面が表示されることが確認できる
サンプルプログラムの実行結果_3

4) application.ymlに定義したユーザーと同じユーザー名またはパスワードを入力し、「OK」ボタンを押下
サンプルプログラムの実行結果_4

5) 以下のように、ログインでき、検索画面が表示されることが確認できるので、「閉じる」ボタンを押下
サンプルプログラムの実行結果_5

6) 画面を閉じてよいかの確認画面が表示されるので、「はい」ボタンを押下
サンプルプログラムの実行結果_6

7) 「http:// (ホスト名):(ポート番号)」とアクセスすると、再度Basic認証画面が表示される
サンプルプログラムの実行結果_7

要点まとめ

  • Spring Securityには、セキュリティ対策の基本機能として「認証」「認可」機能が含まれる。
  • Spring Securityを利用するには、「spring-boot-starter-security」のライブラリを追加し、WebSecurityConfigurerAdapterクラスを継承したクラスで、Spring Securityの認証方法の定義を行う。
  • Spring Securityの認証で、固定のユーザー・パスワードの場合のみ認証できるようにするには、application.yml(またはapplication.properties)の「spring.security.user.name」「spring.security.user.password」を指定する。