spring security 的校验逻辑

通过以下三个接口来理一下spring security (下称ss)的校验逻辑。

  1. 处理用户信息获取逻辑 UserDetailsService
  2. 处理用户校验逻辑 UserDetails
  3. 处理密码加密解密 PasswordEncoder
public interface UserDetailsService {
    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}

实现UserDetailsService接口,重写loadUserByUsername方法。ss会调用这个方法(当然你得把实现类交给spring容器来管理,以保证ss在需要调用的时候能找到),loadUserByUsername会返回一个封装了用户名、密码以及权限信息,还有密码是否过期等信息的UserDetails对象。
参见UserDetails接口:

  public interface UserDetails extends Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();
    String getPassword();
    String getUsername();
    boolean isAccountNonExpired();
    boolean isAccountNonLocked();
    boolean isCredentialsNonExpired();
    boolean isEnabled();
  }

ss会拿着这些信息(来自内存或者来自数据库)与client端传过来的账号密码进行比对。
一般情况下,当注册密码时,我们需要对原始密码进行加密。
我们知道,加密密码时,我们的加密器都是自动注入到IOC容器的。如下

  @Autowired
  private PasswordEncoder passwordEncoder;

那么,加密器来自于哪儿呢?
我们需要在配置类中(BrowserSecurityConfig extends WebSecurityConfigurerAdapter)配置一个加密器。

  @Bean
  public PasswordEncoder passwordEncoder(){
    return new BCryptPasswordEncoder();
  }

一旦你把加密器交给spring,ss就能在适当时候使用该加密器(如加密从client拿到的原始密码,然后与userdetails中的密码比对)。

猜你喜欢

转载自www.cnblogs.com/DongXuefeng/p/9062382.html