上篇文章我们介绍了SpringSecurity系统认证的流程,我们发现系统认证其实是通过一个UserDetailService的实现类来实现的,所以我们就可以使用相同的方式将认证的业务改成和数据库的对比。此案例持久层我们通过Mybatis来实现
一、mybatis准备
1.导入相关依赖
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.3</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.3</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.43</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>
2.配置文件
db.properties
#mysql\u6570\u636E\u5E93\u8FDE\u63A5 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/srm?characterEncoding=utf-8 jdbc.username=root jdbc.password=123456
Mybatis的配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> </configuration>
和spring的整合文件
<!-- 配置数据库连接池 --> <!-- 加载配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 数据库连接池 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driver}" /> <property name="maxActive" value="10" /> <property name="minIdle" value="5" /> </bean> <!-- SqlSessionFactory --> <!-- 让spring管理sqlsessionfactory 使用mybatis和spring整合包中的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据库连接池 --> <property name="dataSource" ref="dataSource" /> <!-- 加载mybatis的全局配置文件 --> <property name="configLocation" value="classpath:mybatis-config.xml" /> <!-- 映射文件和接口文件不在同一个目录下的时候 它的spring是不会去扫描jar包中的相应目录的,只会去他当前项目下获取。其实要改变这种情况很简单, 在classpath后面加一个*号,*号的作用是让spring的扫描涉及全个目录包括jar --> <property name="mapperLocations" value="classpath*:mapper/*.xml"/> </bean> <!-- Mapper映射文件的包扫描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.dpb.security.dao" /> </bean>
3.pojo文件
package com.dpb.security; /** * @program: springboot-52-security * @description: 用户 * @author: 波波烤鸭 * @create: 2019-12-01 22:26 */ public class UserPojo{ private Integer id; private String username; private String password; private String salt; private String nickname; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSalt() { return salt; } public void setSalt(String salt) { this.salt = salt; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } }
4.dao接口
定义一个根据账号查询的方法即可
5.映射文件
<?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"> <mapper namespace="com.dpb.security.dao.UserDao"> <select id="queryByUserName" resultType="com.dpb.security.pojo.UserPojo"> select * from t_user where username = #{userName} </select> </mapper>
6.service
接口定义
接口实现
二、service修改
接下来我们看看如何将SpringSecurity引入进来
1.UserService 继承 UserDetailService接口
2.重写loadUserByusername方法
/** * 根据账号查询 * @param s 登录表单输入的账号 * @return * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { // 根据账号去数据库中查询 UserPojo userPojo = this.queryByUserName(s); if(userPojo != null){ List<SimpleGrantedAuthority> authorities = new ArrayList<>(); // 设置登录账号的角色 authorities.add(new SimpleGrantedAuthority("ROLE_USER")); UserDetails user = new User(userPojo.getUsername(),"{noop}"+userPojo.getPassword(),authorities); return user; } // 返回null 默认表示账号不存在 return null; } }
三、配置文件修改
既然使用自定义的认证方法,那么原来设置的内存中的账号就不需要了
四、登录测试
启动系统,登录测试即可
搞定~
五、加密处理
显然在实际项目中,对密码加密是必须的,所以我们就来看看SpringSecurity中是怎么做加密的。我们在此处通过BCryptPasswordEncoder来加密,动态加盐的方式
配置文件中设置加密规则
去掉{noop}
修改数据库中对应的密码
六、认证状态判断
我们在实际项目中因为用户的不同操作,可能会给出不同的状态,比如正常,冻结等,SpringSecurity也支持,我们来看下,如何实现。
然后我们在认证的时候使用User对象的另一个构造器就可以了
参数 | 说明 |
boolean enabled | 是否可用 |
boolean accountNonExpired | 账号是否失效 |
boolean credentialsNonExpired | 秘钥是否失效 |
boolean accountNonLocked | 账号是否锁定 |
如此设置即可
然后状态(status)为0的记录就没法正常登陆咯~