一、Spring Security中的核心类
1.1、自动配置类
UserDetailsServiceAutoConfiguration
1.2、密码加密器
1.2.1、概述
Spring Security 提供了多种密码加密方案,官方推荐使用 BCryptPasswordEncoder,BCryptPasswordEncoder 使用 BCrypt 强哈希函数,开发者在使用时可以选择提供 strength 和 SecureRandom 实例。strength 越大,密钥的迭代次数越多,密钥迭代次数为 2^strength。strength 取值在 4~31 之间,默认为 10。不同于 Shiro 中需要自己处理密码加盐,在 Spring Security 中,BCryptPasswordEncoder 就自带了盐,处理起来非常方便。而 BCryptPasswordEncoder 就是 PasswordEncoder 接口的实现类。
1.2.2、PasswordEncoder
public interface PasswordEncoder {
/*
* encode 方法用来对明文密码进行加密,返回加密之后的密文
*/
String encode(CharSequence var1);
/*
* matches方法是一个密码校对方法,在用户登录的时候,将用户传来的明文密码和数据库中保存的密文密码作为参数,
* 传入到这个方法中去,根据返回的 Boolean 值判断用户密码是否输入正确
*/
boolean matches(CharSequence var1, String var2);
/*
* upgradeEncoding 是否还要进行再次加密,这个一般来说就不用了
*/
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
1.3、UserDetailService
1.3.1、概述
Spring Security支持多种数据源,例如内存、数据库、LDAP等,这些不同来源的数据被共同封装成了UserDetailService接口,换句话说任何实现了UserDetailService接口的对象都可以作为认证数据源,因为我们还可以通过重写WebSecurityConfigurerAdapter 中的 userDetailsService 方法来提供一个 UserDetailService 实例进而配置多个用户。
1.3.2、继承结构(基于spring-boot-starter-security:2.3.2.RELEASE)
1.4、UsernamePasswordAuthenticationFilter
1.4.1、概述
处理用户名/密码的核心类。
1.4.2、部分核心源码
1.5、Authentication
1.5.1、概述
Authentication是Spring Security中一个非常重要的对象,我们可以在任何地方注入 Authentication 进而获取到当前登录用户信息,Authentication 本身是一个接口,它实际上是对 java.security.Principal 做了进一步的封装。
1.5.2、源码
public interface Authentication extends Principal, Serializable {
Collection<? extends GrantedAuthority> getAuthorities();
Object getCredentials();
Object getDetails();
Object getPrincipal();
boolean isAuthenticated();
void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;
}
1.6、AuthenticationProvider
1.6.1、概述
AuthenticationProvider 定义了 Spring Security 中的验证逻辑。
1.6.2、源码
public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
boolean supports(Class<?> authentication);
}