LoginSignup
16
28

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-10-27

目標と概要

ログイン画面にて、ユーザ名とパスワードを要求。
予め、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クラスを作成していきます。

16
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
28