springSecurity用户名称和密码校验是如何指定对应实现类的?

@Resource
private AuthenticationManager authenticationManager;
authenticationManager拥有多个实现类
调用authenticate方法时去校验用户名和密码时去调用了ProviderManager实现类中authenticate方法
authentication = authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(username, password));

不知道是在哪里指定的?可以解释一下嘛

因为是校验用户名密码,所以过滤器会构造 UsernamePasswordAuthenticationToken ,根据该类型,Provider Manager会找到 DaoAuthenticationProvider来作为provider 。authenticate 就在 DaoAuthenticationProvider的父抽象类AbstractUserDetailsAuthenticationProvider中实现 ·

默认情况这个校验使用的事全局校验器中的AuthenticationManager,而这里实际使用的是一组AuthenticationProvider去校验的。所以你有两种方法解决你的问题。
第一种(也是推荐的)就是自定义个AuthenticationProvider的Bean这样会默认设置到全局校验器中或者直接通过HttpSecurity指定http.authenticationProvider(自定义)。
第二种就是在配置HttpSecurity的时候通过获取共享对象(AuthenticationManagerBuilder并将其默认的父校验器替换成自己的。为什么不直接替换自身的AuthenticationManagerBuilder?因为替换自身的还需要自定义HttpSecurity Bean,而一般我们尽量不要去破坏内部的众多默认实现。