前言
上篇文章介绍了如何在Spring Boot引入Security
接下来,博主会简单的介绍下如何自定义登录配置
开始
首先,我们要有数据库的用户表,这里我用的是mysql5.6
表结构如下:
字段的话就不详细介绍了,相信看名字就能懂
整体demo结构如图:
虽然说是demo,但是本着严格务实的态度,也是遵守MVC的调用流程,所以包可能会有点繁琐
这里简单的说下这个登录验证的流程,以便大家更好的理解下面的代码,先看图:
绿色背景色为自定义实现的,也就是下面会出现的类方法
对于中间件那块来说是暂时没有的,可以不管先,后面的文章会引入,到时候再作介绍
当然,Spring Security认证的流程是没有那么简单的,这里只是给大家方便理解才简化了很多流程
下面开始展示代码
由于需要操作数据库,以及展示页面等,小编这里就需要引入持久层以及前端页面一些框架
这里博主用的是Spring Data Jpa,前端用的是Thymeleaf,Maven代码如下:
1 |
|
添加完相关的依赖,还是到项目的根目录下,执行maven的编译命令,把相关的jar下载下来:mvn clean compile
yml的配置不需要多大的修改,这次只是配置了数据源和jpa的一些基础属性,代码如下:
1 | server: |
这里要注意的是,当引入的mysql-connector-java版本是6.0以上的话,那驱动就是:
com.mysql.cj.jdbc.Driver
中间是多个cj的
还有就是在数据源url后面要加上serverTimezone=UTC这条参数,否则也是会报错的
jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
接下来就是编写spring security的配置类:
SecurityConfig .java
1 | /** |
注意,Spring Security配置类必须继承WebSecurityConfigurerAdapter类才会生效
这里BCrypt加密方式是官方推荐使用的,还有就是Spring Security5.x是不需要配置加密方式的,因为它可以匹配多种加密方式以用来解密,只需要在密码前面加上加密方式即可,格式如下:
{加密方式}密文
例如:
- {MD5}e10adc3949ba59abbe56e057f20f883e
- {bcrypt}$2a101010bOZ5qFQS4OojeLUdb6K8.OU/KrVR8vzdo7QaCNKNG4oaIYUrAGKJ2
这样就可以实现兼容多个加密方式,可以说是挺人性化的,不过我这里还是规定死了哈哈哈哈
然后就是编写User实体类和UserService实现类:
User.java
1 | /** |
这里要说明下,UserDetails是Spring Security提供的一个保存用户账号信息的接口,详情请看代码注释,因为有些地方是没有用到的,所以就写死了很多属性,大家可根据实际需求来修改使用
UserService.java
1 | /** |
同理 UserDetailsService 也是是spring security提供的,这里实现了加载用户名称的方法,目的是为了获取用户信息,以便接下来的认证
UserRepository .java
1 | /** |
这个相信不用多说了吧
下面就是自定义认证的核心代码:
LoginValidateAuthenticationProvider.java
1 | /** |
这里通过实现AuthenticationProvider 认证授权类,以达到自定义登录的效果,注意,这里是结合了之前实现的loadUserByUsername方法去获取用户信息,以及用户状态去判断登录是否能通过
接下来就是handler代码:
LoginSuccessHandler.java
1 | /** |
LoginFailureHandler.java
1 | /** |
那么到这里,也已经差不多了,现在还差的是登录的前端页面和一些效果
login.html
1 |
|
这里为了方便演示,就直接在前端输出登录信息,下面看看演示图:
这里我在数据库加了条登录数据,数据默认用户脚本如下,用户名、密码(admin/123456):
1 | INSERT INTO `test`.`sys_user` (`id`, `locked_flag`, `password`, `username`) VALUES ('1', b'1', '$2a$10$UNVzCpRC3ND2XrCu8rZWJ.OkAzpyP651itODJiKTMOpqLMWrTLcEi', 'admin'); |
这里我在数据库加了条登录数据,当填正确账号点击登录的时候,显示是成功的
随便输入个错误的密码则是:
输入个不存在的用户名则是:
修改用户状态为锁定则是:
那么基本代码和效果也演示完毕了
源码获取方式加加入QQ交流群(715224124),进群找群主要源码,如果有问题,可以提出疑问,群主会尽量帮助解决~
希望能帮助到大家,如果有不好或者错误的地方希望能多多提出,谢谢大家~