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     |


##依存関係

```groovy: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及び定義ファイルの作成
```java:TCustomerEntity.java
private Integer id;
private String username;
private String password;

//setter,getter省略
```

```xml: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>
```
```java:TCustomerMapper.java
//Mapperinterfaceであることを明記
@Mapper
public interface TCustomerMapper {
        
	TCustomer findByUsername(String username);//xmlで定義したステートメント
}
```
ここまでが、MyBatisの設定になります。
つぎはDB認証を実装します。

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

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

```java: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クラスを作成していきます。