我在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类。