推荐预热博文:Spring Security6.x认证架构解析
目录
前言
该文介绍AuthenticationProvider的功能,以及与UserDetailService的关系。
一、模块核心结构展示
二、结构说明
1.AuthenticationProvider是接口,抽象方法是authenticate(),之前的博文介绍过,AuthenticationProvider是认证逻辑的提供者,每一个实现AuthenticationProvider接口的类,都将成为认证逻辑的实际提供者,并交给ProviderManager去迭代执行;
2.图示中的"UsernamePasswordAuthenticationToken"是一个Authentication对象;
3.DaoAuthenticationProvider是AuthenticationProvider的实现类,它的认证逻辑是:将当前用户的密码和内存/jdbc/ldap中被检索用户的密码进行对比;
4.DaoAuthenticationProvider中有三个核心方法:addtionalAuthentiationChecks(),authenticate(),createSuccessAuthentication();
5.authenticate():先检索用户,再比对密码,最后返回对象,对象中有新的认证状态;
检索依据是:当前待认证用户的principal,即Authtication对象的principal属性;
检索位置是:当前内存中,或者jdbc中,或者ldap中,取决于你使用的UserDetailService;默认情况下,使用的UserDetailService是在内存中进行检索;这种情况下,需要你对UserDetailService先设置几个用户,如下:
@Bean
public UserDetailsService userDetailsService() {
UserDetails userDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("123")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(userDetails);
}
6.AuthenticationProvider和UserDetailService的关系如图所示,UserDetailService用以存储用户,在认证阶段,AuthenticationProvider会从UserDetailService的实现类中,检索出用户,与当前用户进行比对;
7.UserDetailService的实现方法有很多,基于内存的/基于jdbc的/基于ldap的,最常见的,也是作为基础教程使用的,是基于内存的实现方法;
8.UserDetail是实际的user对象,包含用户名/密码,这无需赘述;
总结
如果你了解Java web相关开发技术,经过这系列博文介绍,你会对Spring Security的认证模块有一个更全面的了解,对你在公司中实际运用Spring Security会有一个直接的帮助;后续会继续补充介绍该模块的内容(包括直观的代码教程等),以及最重要的,接下来会加入授权和oauth2.0这两个重要模块的内容,完善Spring Security整个体系的介绍。