我在Spring Security中实现了使用数据库进行登录认证的处理(使用了MyBatis)

目标和概述

在登录界面上要求输入用户名和密码。
之后,将用户名和密码与预先存储在数据库的用户表进行比对,然后进行登录成功与否的处理。

环境

SpringBoot 1.5.8.RELEASE
MySQL5.7
O/R映射工具MyBatis
使用Gradle

使用的数据库表(t_customer)。

idusernamepassword1hoge@hoge.co.jp12345678

依赖关系

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')
}

操作流程

数据库连接设置

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

请根据适当的环境做出调整。

创建地图、实体和定义文件

private Integer id;
private String username;
private String password;

//setter,getter省略
<?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>
//Mapperinterfaceであることを明記
@Mapper
public interface TCustomerMapper {

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

接下来,我们将实现数据库认证。

创建一个管理认证用户的类。

可以选择与Entity类一起使用这个角色,但我们将按照例子引用Entity实例。
此外,这次不会实现用户的锁定等功能。

按照SpringSecurity中定义的UserDetails来实现。

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类和与安全性相关的Config类。

广告
将在 10 秒后关闭
bannerAds