前言
前面讲解了关于SpringSecurity的基本原理,其中介绍了过滤器链以及过滤器加载的过程。我们在前面入门案例中的用户名和密码是系统自动生成的,在真实应用环境中,是需要查询数据库获取用户名密码是否匹配的,那么如何实现呢?这就涉及到了今天我们要讲解的两个比较重要的接口了。
接下来,我们一起看一下这两个接口吧。
UserDetailsService
什么都没有配置的前提下,账号和密码是有Spring Security 定义的,并且由他来完成。但是实际的应用中,我们是需要自定义认证控制逻辑的。
自定义认证逻辑,就是需要我们去实现UserDetailsService接口。
这里我们可以看到根据用户名加载用户信息的接口返回了UserDetails 。
他就是我们系统默认的登录用户主体。
package org.springframework.security.core.userdetails;
import java.io.Serializable;
import java.util.Collection;
import org.springframework.security.core.GrantedAuthority;
public interface UserDetails extends Serializable {
// 获取登录用户所有权限
Collection<? extends GrantedAuthority> getAuthorities();
// 获取用户的密码
String getPassword();
// 获取用户名
String getUsername();
// 判断账号是否过期了
boolean isAccountNonExpired();
// 判断账号是否已经被锁定
boolean isAccountNonLocked();
// 凭证(密码)是否过期
boolean isCredentialsNonExpired();
// 当前用户是否可用状态
boolean isEnabled();
}
方法参数中的username标识用户名,此值是客户端表单传递过来的数据。默认必须交username,否则无法接收请求参数。
PasswordEncoder
它是Spring Security
的密码编码器,PasswordEncoder有很多
实现类,也有被标记了@Deprecated
注解的实现类,一般是被标记了@Deprecated则表示该类的密码编码器(加密算法)不安全,比如可以在能接受的时间内被破解,例如彩虹表攻击。
// 表示把参数按照特定的解析规则进行解析
String encode(CharSequence rawPassword);
// 表示验证从存储中获取的编码密码与编码后提交的原始密码是否匹配。如果密码匹 配,则返回 true;如果不匹配,则返回 false。第一个参数表示需要被解析的密码。第二个 参数表示存储的密码。
boolean matches(CharSequence rawPassword, String encodedPassword);
// 表示如果解析的密码能够再次进行解析且达到更安全的结果则返回 true,否则返回 false。默认返回 false。
default boolean upgradeEncoding(String encodedPassword) { return false; }
BCryptPasswordEncoder 是 Spring Security 官方推荐的密码解析器,平时多使用这个解析器。 BCryptPasswordEncoder 是对 bcrypt 强散列方法的具体实现。是基于 Hash 算法实现的单向加密。可以通过 strength 控制加密强度,默认 10。
关于UserDetailsService和PasswordEncoder的说明就到这里。
欢迎大家点击下方卡片,关注《coder练习生》