Spring Security(maven项目) 3.0.3.0版本
前言:
通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往复以至无穷,而实践和认识之每一循环的内容,都比较地进到了高一级的程度。
在上一期中,我们完成了自定义账号/密码认证(基于内存认证)并得到了两个基本模板+一个自定义用户模板
Security FilterSecurity自定义模板
@Configuration //用于标记一个类为配置类,表示该类包含Bean的定义。
@EnableWebSecurity //其中一个功能:注入SecurityFilterChain
public class WebSecurityConfig {
//自定义配置
}
Security Chain Filter 注册模板
public class SecurityWebApplicationInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
// 注册Security Filter Chain
// 花括号公式:带有@EnableWebSecurity的类
// return new Class[]{ Security 配置 文件名.class };
return new Class[]{WebSecurityConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[0];
}
@Override
protected String[] getServletMappings() {
return new String[0];
}
}
内存认证模板 · 一
//基本配置
//可以通过修改username和password达到自定义登录
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(
User
.withDefaultPasswordEncoder()
.username()
.password()
.roles("USER")
.build());
return manager;
}
本期目标:
完成JDBC 认证的理论与实践
正片:
温故知新:
上一期中,我们通过修改方法的参数完成了自定义登录,准确点叫内存认证,根据内存中的账号/密码进行认证,我们的代码会存放之内存中,其中就包含了一个叫user的一块内存区域,它储存了我们的账号和密码,SpringSecurity可以读取到他们,并且与表单进行校验
在上一期中,我们通过修改InMemoryUserDetailsManager.create中的参数,完成基于内存认证。
内存认证:重点在于内存二字
为了更好的去阅读,这里统一些许内容:
账号:即包含了用户名和密码
作者得出了新结论,我称之为内存2.0版本:内存二字在于形式,即,用户名/密码储存的形式,用户名/密码储存在内存中,当需要认证时,取出内存中的用户名/密码与前端表单进行校验
内存二字的核心在于形式,即:账号的来源与储存的形式;例如:内存认证,就是账号来源与储存在内存之中
回到我们的正片JDBC认证,JDBC认证和内存认证异曲同工之妙,JDBC也是指账号的来源与储存形式,这里作者认为,JDBC是在内存认证的基础上迭代而成的,也就是它保留了部分内存认证的特定,即JDBC和内存认证的区别在于账号来源的不同,以及相同的储存在内存的这一特点
为了大伙更简单的阅读代码,这里我将代码提交到了码云
Security JDBC认证: 用于验证的基本代码
为了避免不必要的空指针问题,我们采用了经典的CRUD模板
这个不必的空指针问题是这个
由于没有很好的办法解决,所以使用了全新的版本
我们总共分为了以下步骤:
第一步:在项目中添加对应数据库驱动(mysql),以及JDBC框架(mybatis)
第二步:在application.yaml文件中注册数据库
第三步:添加测试使用的表
第四步:创建实体类
第五步:创建Mapper层
第六步:创建Servlet层
第七步:创建Imp层
第八步:创建控制类
第九步:修改内存认证的username和password
第十步:启动
有人就会问,你都提供代码了,为什么数据库不顺带提供,别问,问就是没添加
第一步:添加数据库驱动和JDBC框架
第二步:注册数据库
第三步:没有提供SQL,自己随便整一个
create table user_test
(
username varchar(255) null,
password varchar(255) null,
id int not null
primary key
);
第四步:实体类
第五步:Mapper层
第六步:创建Servlet接口
第七步:实现Servlet
第八步:创建控制类
第九步:
第十步:启动
为了更直观的去体验,我们在内存认证的基础上进行一个添加断点
在运行这句时,读取到了数据库的内容
进入登录页面,根据数据库读取的内容进行登录
登录成功
静态JDBC认证成功,即修改了用于验证的用户来源,既然有静态那么动态是什么?动态就是根据用户输入的内容,动态的去触发数据库,动态的去寻找