spring-security
spring
MyBatis
spring-boot

SpringSecurityでDBログイン認証処理を実装してみた(MyBatis使用)

目標と概要

ログイン画面にて、ユーザ名とパスワードを要求。
予め、DBに登録しておいたユーザーテーブルと照合し、ログイン成功可否処理をする。

環境

SpringBoot 1.5.8.RELEASE
MySQL5.7
O/RマッパーMyBatis
Gradle使用

使用するDBのテーブル(t_customer)
| id | username | password |
|:-----------|------------:|:------------:|
| 1 | hoge@hoge.co.jp | 12345678 |

依存関係

build.gradle
dependencies {
    compile group: 'org.thymeleaf.extras', name: 'thymeleaf-extras-springsecurity4'
    compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.5'
    compile('org.springframework.boot:spring-boot-starter-security')
    compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.1')
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    runtime('mysql:mysql-connector-java')
    testCompile('org.springframework.boot:spring-boot-starter-test')
}

手順

DB接続設定

application.properties
spring.datasource.url=jdbc:mysql://localhost/〇〇?autoReconnect=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=0000
spring.datasource.driverClassName=com.mysql.jdbc.Driver

適宜、環境に合わせて変更してください。

Mapper、Entity及び定義ファイルの作成

TCustomerEntity.java
private Integer id;
private String username;
private String password;

//setter,getter省略
TCustomerMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--次に作成するMapperInterfaceをFQCNで指定-->
<mapper namespace="com.example.demo.model.mapper.TCustomerMapper">
<!--EntityクラスのプロパティとDBのデータをマップする、対応するEntityクラスは、FQCNで指定-->
  <resultMap id="BaseResultMap" type="com.example.demo.model.entity.TCustomerEntity" />

<!--今回利用するステートメントの定義-->
  <select id="findByUsername" parameterType="java.lang.String" resultMap="BaseResultMap">
    select
    id,username,password
    from t_customer
    where user_id = #{username,jdbcType=VARCHAR}
  </select>
TCustomerMapper.java
//Mapperinterfaceであることを明記
@Mapper
public interface TCustomerMapper {

    TCustomer findByUsername(String username);//xmlで定義したステートメント
}

ここまでが、MyBatisの設定になります。
つぎはDB認証を実装します。

認証ユーザを管理するクラスの作成

この役割はEntityクラスと併用してもよいのですが、例に習ってEntityインスタンスを参照する形にします。
また、今回はユーザのロック等は実装しません。

SpringSecurityで定義されているUserDetailsを実装する形で作ります。

TCustomerUserDetails.java
public class TCustomerUserDetails implements UserDetails {
    private TCustomerEntity tCustomer;

    public TCustomerUserDetails(TCustomerEntity tCustomer) {
        // TODO 自動生成されたコンストラクター・スタブ
        this.tCustomer = tCustomer;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO 自動生成されたメソッド・スタブ
        return null;
    }

    @Override
    public String getPassword() {
        // TODO 自動生成されたメソッド・スタブ
        return this.tCustomer.getPassword();
    }

    @Override
    public String getUsername() {
        // TODO 自動生成されたメソッド・スタブ
        return this.tCustomer.getUserId();
    }

    @Override
    public boolean isAccountNonExpired() {
        // TODO 自動生成されたメソッド・スタブ
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        // TODO 自動生成されたメソッド・スタブ
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        // TODO 自動生成されたメソッド・スタブ
        return true;
    }

    @Override
    public boolean isEnabled() {
        // TODO 自動生成されたメソッド・スタブ
        return true;
    }
}

今回はここまで、次回は認証処理を実行するServiceクラスとSecurityに関するConfigクラスを作成していきます。