目录
- 1 回顾
- 2 自定义的登录的逻辑
- 3 UserDetailsService接口
- 4 PasswordEncoder密码解析器详解
- 5 自定义登录逻辑
1 回顾
之前的,在配置里面,我们也可以配置数据源,从数据库里面拿用户名和密码
这个认证配置里面,修改一下这个方法,变为数据源的就可以
但是我们还有另外的方法,也就是现在我们想要自定义登录判断的逻辑,现在是自定义逻辑,之前只要配置之后,springsecurity框架自己给你判断是不是对应的用户,判断的逻辑是框架给你的,现在我们想要自己判断,这个咋处理。以下是步骤
2 自定义的登录的逻辑
1 导入依赖
只要导入依赖之后就可以使用,这个是简单的使用,有默认的登录页面,这个依赖是
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3 UserDetailsService接口
如果需要自定义逻辑时,只需要实现UserDetailsService接口即可。也就是我们不想要使用框架给我们的登录页面,不想要默认的登录名和密码,需要我们自己设定,那么就需要使用这个接口
也就是要自定义用户登录逻辑,必须要实现这个UserDetailsService接口,返回值也是一个接口UserDetails,但是返回值是接口我们不能使用,所以使用他的实现类,有很多的实现类,我们使用user类,这个类下面有很多的方法。
我们只需要判断用户名,密码是这个框架给我们自己进行验证的,不需要我们做,因为这个框架要给前段传过来的密码进行加密,所以需要框架自己做
4 PasswordEncoder密码解析器详解
这个框架会给我们的密码进行加密,之后再和数据库中的密码进行比较。那么是如何加密的呢?
Spring Security要求容器中必须有PasswordEncoder实例(客户端密码和数据库密码是否匹配是由Spring Security 去完成的,Security中还没有默认密码解析器)。所以当自定义登录逻辑时要求必须给容器注入PaswordEncoder的bean对象.
PaswordEncoder是一个接口,里面有很多的方法,下面有很多的实现类,不同的加密算法是使用不同的实现类。
我们使用的是BCryptPasswordEncoder这个实现类
BCryptPasswordEncoder是Spring Security官方推荐的密码解析器,平时多使用这个解析器。
@SpringBootTest
@RunWith(SpringRunner.class)
public class MyTest {
@Test
public void test(){
//创建解析器
PasswordEncoder encoder = new BCryptPasswordEncoder();
//对密码进行加密
String password = encoder.encode("123");
System.out.println("------------"+password);
//判断原字符加密后和内容是否匹配
boolean result = encoder.matches("123",password);
System.out.println("============="+result);
}
}
5 自定义登录逻辑
新建一个项目,导入spring security的依赖
在配置类里面实现密码的bean,这个是必须注入,因为框架要求的
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
之后在业务层写登录的逻辑,这个逻辑要实现UserDetailsService接口,重写里面的方法
===============================================================
现在自定义登录页面
我们自己写一个页面,在controller层写登录的跳转页面,还需要在配置类,这个配置类要实现WebSecurityConfigurerAdapter接口,必须是这个接口,这个就是这个框架的接口,并且要实现这个方法
configure,这样在这个方法里面写框架的配置类就可以
现在自定义登录页面
我们自己写一个页面,在controller层写登录的跳转页面,还需要在配置类,这个配置类要实现WebSecurityConfigurerAdapter接口,必须是这个接口,这个就是这个框架的接口,并且要实现这个方法
configure,这样在这个方法里面写框架的配置类就可以
我们如果不写这个配置类,在登录的时候,还是默认的框架登录页面,走的流程就是,前端传过来的数据路径,先走这个控制类,没有就是走默认的控制类,默认的控制类就是默认的登录页面,不会走我们自定义的页面。走完配置类里面的逻辑之后,才会走controller层。
// 设置URL的授权问题
// 多个条件取交集
http.authorizeRequests()
// 匹配 / 控制器 permitAll() 不需要被认证就可以访问
.antMatchers("/").permitAll() 括号里面的路径,不用认证就可以直接到controller层
// anyRequest() 所有请求 authenticated() 必须被认证
.anyRequest().authenticated();其他的必须要走认证器才可以走